相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

右值引用是否允许悬空引用?

考虑以下.

#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是一个悬空引用,不是吗?

c++ rvalue c++11

31
推荐指数
2
解决办法
3064
查看次数

xvalue和prvalue FOR NON-POD对象之间允许的使用或行为有何不同?

什么是右值,左值,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)

c++ rvalue c++11

15
推荐指数
1
解决办法
1213
查看次数

标签 统计

c++ ×3

c++11 ×3

rvalue ×2

c++-faq ×1

expression ×1