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限定的左值,该值引用临时对象.
因此,同样的临时对象可能很容易被"看作"为右值或左值,具体取决于您用来"查看"该对象的表达式(访问路径类型).
Prasoon Saurav已经将一个非常好的clc ++线程联系起来.在那里,James Kanze解释了为什么这个问题没有意义.归结为:
出于这个原因,这个问题没有意义.
一个很好的例子是以下代码:
int main() {
const int& ri = 4;
std::cout << ri << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
带值的临时int 4不是表达式.ri打印的表达式不是暂时的.这是一个左值,指的是临时的.