区分左值右值的真正说法是:能否用“取地址&”运算符获得对象的内存地址。
临时对象是右值,可以被右值引用或者常量左值引用来引用;
持久对象是左值,可以被左值引用或常量左值引用来引用;
对于临时对象,它可以存储于寄存器中,所以是没办法用“取地址&”运算符;
对于常量,它可能被编码到机器指令的“立即数”中,所以是没办法用“取地址&”运算符;
字符串字面值常量是C++标准中明确指明的特例,为常量左值,所以可以取地址&运算,其地址属于进程的只读内存空间。其它的字面值常量都是“纯右值”。
也就是说:
&5 ; //非法. 5为常量右值
&("hello") ; // 合法,"hello" 为常量左值