在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
考虑以下.
#include <string>
using std::string;
string middle_name () {
return "Jaan";
}
int main ()
{
string&& danger = middle_name(); // ?!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不会计算任何东西,但它编译时没有错误,并演示了一些让我感到困惑的事情:danger是一个悬空引用,不是吗?
什么是右值,左值,x值,glvalues和prvalues?对rvalues/lvalues的分类进行了很好的概述,最近对该问题的回答之一(/sf/answers/668701631/)强调了prvalues"喜欢"旧式rvalues的观点而新的xvalues允许"左值"行为.
但是,请考虑以下代码:
class X {};
X foo() { return X(); }
int main()
{
foo() = X(); // foo() is a prvalue that successfully appears on the lhs
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,表达式foo()是出现在左侧的prvalue,并接受赋值.
这让我思考 - "xvalues"与"prvalues"的逻辑不同,因为xvalues(它们是glvalues)可能出现在左侧,似乎被这个例子打破了.在这里,我们有一个prvalue - 这不是一个glvalue - 成功地出现在lhs并接受任务.
(注意:在POD的情况下,上面的例子不会编译,所以对于POD,xvalues和prvalues之间的区别似乎是有意义的.因此,这个问题特别针对非POD类型.)
那么,xvalue和prvalue之间的允许使用或行为的真正区别是什么,这需要将这种区别写入标准?差异的一个例子是一个很好的替代答案.
附录
Pubby的评论是正确的.prvalue的生命周期由编译器扩展,但xvalue的生命周期不是.
所以,这是一个问题的答案:
请考虑以下代码:
// ***
// Answer to question, from Pubby's comment
// ***
class X
{
public:
X() : x(5) {}
int x;
};
X foo() { return X(); }
X&& goo() { return …Run Code Online (Sandbox Code Playgroud)