我花了很长时间才理解右值和临时对象之间的区别。但现在委员会的最终草案在第 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 不是临时对象。有人同意我的观点还是我疯了?:)