FCD中的右值和临时对象

时间:2010-06-09 16:19:05

标签: c++ c++11 temporary rvalue

我花了很多时间来理解右值和临时对象之间的区别。但现在最终的委员会草案在第75页说明:

  

rvalue [...] xvalue,临时对象或其子对象,或与之无关的值一个对象。

我不敢相信自己的眼睛。这一定是个错误,对吧?


澄清一下,以下是我对术语的理解:

#include <string>

void foo(std::string&& str)
{
    std::cout << str << std::endl;
}

int main()
{
    foo(std::string("hello"));
}

在此程序中,有两个表达式表示相同的临时对象:prvalue std::string("hello")和左值str。表达式不是对象,但它们的评估可能会产生一个。具体来说,prvalue的计算产生一个临时对象,但prvalue不是临时对象。有没有人同意我或让我疯了? :)

2 个答案:

答案 0 :(得分:2)

是的,我同意你的看法。这应该在我看来是固定的,有些人我非常尊重这个问题。

答案 1 :(得分:0)

这并不像听起来那么复杂。我指的是现在最终确定的标准ISO / IEC 14882-2011。第78页说:

  

xvalue(“eXpiring”值)也指对象,通常在附近   它的生命周期结束(以便它的资源可以被移动,因为   例)。 xvalue是某些表达式的结果   涉及右值参考(8.3.2)。

上面添加了大胆的内容。该标准进一步说:

  

rvalue(历史上所谓的,因为rvalues可能出现在   赋值表达式的右侧是xvalue,a   临时对象(12.2)或其子对象,或不对应的值   与对象相关联。

所以当你玩“涉及右值参考的某些表达式”时,你只得到一个xvalue。否则你的临时对象就是 - 临时对象。