在C++中,所有临时值都是rvalues吗?

Pra*_*rav 34 c++ rvalue temporaries

过去几年我一直用C++编写代码.但有一个问题我无法弄清楚.我想问一下,C++,rvalues都是临时工吗?

如果不是,任何人都可以提供一个例子,其中代码中的临时生成是左值

AnT*_*AnT 44

没有.

C++语言规范永远不会像你要问的那样直截了当地断言.它并没有在语言标准中的任何地方说"所有临时对象都是右值".此外,问题本身有点用词不当,因为在C++语言中作为rvalue的属性不是对象的属性,而是表达式的属性(即其结果的属性).这实际上就是它在语言规范中的定义方式:对于不同类型的表达式,当结果是左值并且它是右值时它会表示.除此之外,这实际上意味着临时对象可以作为右值和左值访问,具体取决于用于执行访问的特定表达形式.

例如,文字2 + 3表达的结果显然是一个rvalue,一个临时类型int.我们不能将一元&应用于它,因为一元&需要左值作为其操作数

&(2 + 3); // ERROR, lvalue required
Run Code Online (Sandbox Code Playgroud)

但是,众所周知,常量引用可以附加到临时对象,如

const int &ri = 2 + 3;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,引用附加到临时,延长后者的生命周期.显然,一旦完成,我们就可以访问与左值相同的临时值ri,因为引用总是左值.例如,我们可以轻松合法地将一元&应用于引用并获取指向临时的指针

const int *pi = &ri;
Run Code Online (Sandbox Code Playgroud)

只要临时持续存在,指针仍保持完全有效.

左值访问临时对象的另一个明显例子是当我们通过其this指针访问类类型的临时对象时.结果*this是左值(对于*应用于数据指针的一元结果总是如此),但它并没有改变实际对象可能很容易成为临时对象的事实.对于给定的类类型T,expression T()是一个rvalue,如语言标准中明确规定的那样,但通过*T().get_this()表达式(具有明显的实现T::get_this())访问的临时对象是左值.与前面的示例不同,此方法允许您立即获取非const限定的左值,该值引用临时对象.

因此,同样的临时对象可能很容易被"看作"为右值或左值,具体取决于您用来"查看"该对象的表达式(访问路径类型).


MSa*_*ers 9

Prasoon Saurav已经将一个非常好的clc ++线程联系起来.在那里,James Kanze解释了为什么这个问题没有意义.归结为:

  • rvalue-ness是表达式的(boolean)属性 - 每个表达式都是左值或右值
  • 临时的不是表达

出于这个原因,这个问题没有意义.

一个很好的例子是以下代码:

int main() {
  const int& ri = 4;
  std::cout << ri << std::endl; 
}
Run Code Online (Sandbox Code Playgroud)

带值的临时int 4不是表达式.ri打印的表达式不是暂时的.这是一个左值,指的是临时的.

  • 不,它不起作用.表达式可以_create_ temporaries,或_refer_ to temporaries,但它们本身不是临时的.他们只是不同的野兽.举个例子,它是_expression_`int(3)`这是一个右值. (2认同)
  • 你正在做出一个想象中的区分.除了创建和引用值之外,表达式不执行任何操作.表达式的计算可能会导致临时对象的句柄.它可能会导致允许或禁止分配的句柄.关于临时的句柄是否允许赋值的问题是有效的. (2认同)