我花了很多时间来理解右值和临时对象之间的区别。但现在最终的委员会草案在第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不是临时对象。有没有人同意我或让我疯了? :)
答案 0 :(得分:2)
是的,我同意你的看法。这应该在我看来是固定的,有些人我非常尊重这个问题。
答案 1 :(得分:0)
这并不像听起来那么复杂。我指的是现在最终确定的标准ISO / IEC 14882-2011。第78页说:
xvalue(“eXpiring”值)也指对象,通常在附近 它的生命周期结束(以便它的资源可以被移动,因为 例)。 xvalue是某些表达式的结果 涉及右值参考(8.3.2)。
上面添加了大胆的内容。该标准进一步说:
rvalue(历史上所谓的,因为rvalues可能出现在 赋值表达式的右侧是xvalue,a 临时对象(12.2)或其子对象,或不对应的值 与对象相关联。
所以当你玩“涉及右值参考的某些表达式”时,你只得到一个xvalue。否则你的临时对象就是 - 临时对象。