大家看一下,下面的代碼:
[cpp]
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的引用是不能引用右值的所以就產生了上面的錯誤。
如果是
[cpp]
void d(const T &e){}
d(T());
則沒有錯誤,在c++標准中規定了const類型引用可以是右值。
而如果是
[cpp]
void d(T *e){}//不管時不時const
d(new T());
都沒有錯誤,是因為指針是右值。
摘自 緣起