大家看一下,下面的代码:
class T
{
public:
int a;
};
void d(T &e)
{
printf("%d\n", e.a);
}
d(T());
我们不想再多使用一个变量而直接实例化对像,并将其传递进函数,这种方式在java和c#中都是可以的(它们传递的是引用,语意上是合法的)。在C++中编译会出现下面的错误:
invalid initialization of non-const reference of type ‘t&’ from an rvalue of type ‘t’
它产生了一个从一个右值初始化一个非常量引用的错误。
这里有了一个概念是右值,那什么是右值呢?
一个值不是左值就是右值,在C++中右值语意进化成了非左值就是右值。什么是左值(表达式)?左值是有名字或引用的表达式(注意:指针不行)。
因为类t通过t()产生的临时对像是一个右值,而非const的引用是不能引用右值的所以就产生了上面的错误。
如果是
void d(const T &e){}
d(T());
则没有错误,在c++标准中规定了const类型引用可以是右值。
而如果是
void d(T *e){}//不管时不时const
d(new T());
都没有错误,是因为指针是右值。