1.左值、右值
C++
中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。
例
2..左值引用、右值引用
所以,左值引用只能绑定左值,右值引用只能绑定右值,如果绑定的不对,编译就会失败。但是,常量左值引用却是个奇葩,它可以算是一个“万能”的引用类型,它可以绑定非常量左值、常量左值、右值,而且在绑定右值的时候,常量左值引用还可以像右值引用一样将右值的生命期延长,缺点是,只能读不能改。
总结一下,其中T
是一个具体类型:
- 左值引用, 使用
T&
, 只能绑定左值 - 右值引用, 使用
T&&
, 只能绑定右值 - 常量左值, 使用
const T&
, 既可以绑定左值又可以绑定右值 - 已命名的右值引用,编译器会认为是个左值
- 编译器有返回值优化,但不要过于依赖