c++左值和右值

左值和右值

​ c++的表达式要不然是右值,要不然就是左值。这两个名词从C语言继承过来,原本是为了帮助记忆:左值可以作为赋值语句的左侧,右值则不能。

​ 在c++语言中,二者的区别就没有那么简单了。一个左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象。此外,虽然某些表达式的求值结果是对象,但它们是右值而非左值。可以做一个简单的归纳:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

​ 不同的运算符对运算对象的要求各不相同,有的需要左值对象、有的需要右值对象;返回值也有差异,有的得到左值结果、有的得到右值结果。一个重要的原则是在需要右值的地方可以用左值代替,但不能把右值当成左值(也就是位置)使用。当一个左值被当成右值使用时,实际使用的是它的内容(值)。到目前位置,已经有几种我们熟悉的运算符要用到左值的。

  • 赋值运算符需要一个(非常量)左值作为其左侧元算对象,得到的结果也仍然是一个左值。
  • 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是一个右值。
  • 内置解引用运算符、下标运算符、迭代器解引用运算符、string 和 vector 的下标 元算符的求值结果都是左值。
  • 内置类型和迭代器的递增减运算符作用于左值运算对象,其前置版本所得到的结果也是左值。

​ 使用关键字 decltype 的时候,左值和右值也有所不同。如果表达式的求值结果是左值,decltype 作用于该表达式(不是变量)得到一个引用类型。举个例子,假定 p 的类型是 int* ,因为解引用运算符生成左值,所以 decltype(p) 的结果是 int& 。另一方面,因为取地址运算符生成右值,所以 decltype(&p) 的结果是 int*,也就是说,结果是一个指向整形指针的指针。

————–摘抄自 c++ Primer。

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » c++左值和右值