C++ 右值的成员访问运算符是否应为xvalue?

C++ 右值的成员访问运算符是否应为xvalue?,c++,decltype,rvalue,lvalue,xvalue,C++,Decltype,Rvalue,Lvalue,Xvalue,在中,它声明“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是xvalue。在标准(我在:)中找到了它(在第87页),它声明“表达式是一个xvalue,如果它是一个类成员访问表达式,指定一个非引用类型的非静态数据成员,其中对象表达式是一个xvalue。” 我想用以下代码检查我对此的理解: struct B { // B for Boring... int i{0}; }; template <typename T> struct V { V() { cou

在中,它声明“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是xvalue。在标准(我在:)中找到了它(在第87页),它声明“表达式是一个xvalue,如果它是一个类成员访问表达式,指定一个非引用类型的非静态数据成员,其中对象表达式是一个xvalue。”

我想用以下代码检查我对此的理解:

struct B { // B for Boring...
  int i{0};
};

template <typename T> struct V {
  V() { cout << "V" << endl; }
};

template <typename T> struct V<T &> { // Partial Specialization
  V() { cout << "V&" << endl; }
};

template <typename T> struct V<T &&> { // Partial Specialization
  V() { cout << "V&&" << endl; }
};

int main() {
  int i{1};
  V<decltype((1))> v1;       // V
  V<decltype((i))> v2;       // V&
  V<decltype((move(i)))> v3; // V&&

  V<decltype((B().i))> v4;       // V, why not V&&?
  V<decltype((move(B()).i))> v5; // V&& as expected
}
struct B{//B用于钻孔。。。
int i{0};
};
模板结构V{

V(){cout是的,你是对的,这是一个bug,看起来很像,但这个例子是专门处理数组的,数组中有一个切口,表示结果是一个左值,但在其他情况下,同样的逻辑也适用

我们可以看到它是,如果我们检查,但这也是固定的

另请注意,中的问题也仅在中修复

还要注意

…如果E1是左值,则E1.E2是左值;如果E1是xvalue,则E1.E2是xvalue;否则,它是prvalue

在C++11之后更改为:

…如果E1是左值,则E1.E2是左值;否则E1.E2是xvalue


这看起来像是最初的一部分更改,但我不确定它与什么有关。

这似乎是gcc中的一个(已修复)错误,正如预期的那样打印
V&&
,您从N4140引用的文本不适用于
v4
,因为对象表达式
B()
是一个prvalue,而不是xvalue。注释无论如何都是非规范性的。实际规则在[expr.ref]/4.2“如果
E1
是一个左值,那么
E1.E2
是一个左值;否则
E1.E2
是一个xvalue。”谢谢。如果这对任何人来说都很重要,我正在使用Ubuntu 18.04.1,在使用apt升级gcc之后,它给出了同样的结果(不正确)行为。我还要提到,我使用的是一个旧标准,因为我试图在升级到c++17之前“跟上”c++14的速度,但在一个新标准中(我刚查过),由于“临时物化”的引入,有着明显不同的语言。(参见第88页,共页)。