5

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

右值[...]一个xvalue、一个临时对象或它的子对象,或者一个与对象无关的值。

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


为了澄清,这是我对这些术语的理解:

#include <string>

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

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

在这个程序中,有两个表达式表示同一个临时对象:prvaluestd::string("hello")和 lvalue str。表达式不是对象,但它们的评估可能会产生一个。具体来说,prvalue 的评估产生一个临时对象,但 prvalue 不是临时对象。有人同意我的观点还是我疯了?:)

4

2 回答 2

2

是的,我同意你的看法。在我看来,这应该得到解决,我深表敬意的几个人对此提出了完全相同的问题。

于 2010-06-11T20:02:20.743 回答
0

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

一个 xvalue(一个“eXpiring”值)也指一个对象,通常接近其生命周期的末尾(例如,它的资源可能会被移动)。xvalue 是某些涉及右值引用的表达式的结果(8.3.2)。

上面的粗体是我添加的。该标准进一步说:

右值(历史上称为右值,因为右值可能出现在赋值表达式的右侧)是一个 xvalue、一个临时对象 (12.2) 或其子对象,或者一个与对象无关的值。

因此,当您使用“某些涉及右值引用的表达式”时,您只会得到一个 xvalue。否则,您的临时对象就是 - 临时对象。

于 2012-06-28T02:35:28.610 回答