C++ 右值的成员访问运算符是否应为xvalue?
在中,它声明“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是xvalue。在标准(我在:)中找到了它(在第87页),它声明“表达式是一个xvalue,如果它是一个类成员访问表达式,指定一个非引用类型的非静态数据成员,其中对象表达式是一个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
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页,共页)。