區分左值右值的真正說法是:能否用“取地址&”運算符獲得對象的內存地址。
臨時對象是右值,可以被右值引用或者常量左值引用來引用;
持久對象是左值,可以被左值引用或常量左值引用來引用;
對於臨時對象,它可以存儲於寄存器中,所以是沒辦法用“取地址&”運算符;
對於常量,它可能被編碼到機器指令的“立即數”中,所以是沒辦法用“取地址&”運算符;
字符串字面值常量是C++標準中明確指明的特例,爲常量左值,所以可以取地址&運算,其地址屬於進程的只讀內存空間。其它的字面值常量都是“純右值”。
也就是說:
&5 ; //非法. 5爲常量右值
&("hello") ; // 合法,"hello" 爲常量左值