元始天尊 发表于 2014-11-18 11:48:19

左值和右值必知必会

1.概念的提出
   左值和右值是现代C++中极为重要的概念,C++11标准第一次明确提出概念。所有C++表达式结果不是左值就是右值,左值是有固定存储位置的变量,对于内存变量是有固定的内存地址,对寄存器变量是有固定的寄存器,专门用于存储该变量,这种变量出现在复制操作符左边;右值是“匿名”或“临时”变量,在表达式结束时生命周期终止,没有固定的存储位置,因此不能用取地址操作符“&”获取地址,否则会在编译期发生错误。例如int x=0,则x++是右值,++x是左值。
2.为什么引入左值右值
   左值是一切定义的变量,如果没有左值将无法进行编程;而右值是编译器在识别表达式时,将多个左值进行计算得到一个新的左值(也可能不要左值结果)而必须内部生成的临时变量,用于存储中间结果,这个变量可能存在于还没有划分的函数变量栈空间或更好的方式:寄存器。这是在底层,在高级语言层,就节省了定义多个左值变量语句。不过右值的引入,同时可能降低运行效率,如果左值是对象,那么右值也是对象,在进行左值<==>右值相互转换时,会发生多次拷贝构造,而如果把某些特定位置,例如返回类型或参数类型,左值类型改成接收右值,就可以节省左值到右值的相互拷贝,不过多地生成中间对象,为此C++11提出了右值引用T&&和move函数。
template<class T>
typename remove_reference<T>::type&& move(T&& t) noexcept;
页: [1]
查看完整版本: 左值和右值必知必会