在cpprefernce section: Value categories中,它声明“对象表达式的成员,其中a是一个右值,m是一个非引用类型的非静态数据成员”是一个x值。在标准(我在N4140, the draft C++14 standard中找到)中,它声明(在第87页上)“如果表达式是x值,则它是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
}
如果我的计算是正确的,则
B().i
是“对象表达式的成员,其中[B()
]是右值”,根据引用,该表达式应为xvalue,并且decltype
返回的类型应为int &&。请注意,我使用的是gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
,并且没有标志且使用-std=c++14
进行了尝试。(为清楚起见,我也在这里检查我对“decltype”的理解,但是我先前链接的标准和引用文献逐字记录,并且非常清楚decltype的行为)。
抱歉,这不是问题,对吗?是否应更新引用资料以澄清此行为?
最佳答案
是的,您是对的,这是一个错误,它看起来与Is f().a[0]
an xvalue?相似,但是此案例专门处理了在[expr.sub]p1中分割出的数组,该数组表示结果为左值,但deemed a defect。否则,将应用相同的逻辑。
我们可以看到它是fixed in clang 4.0,如果我们检查clang < 4.0 live,我们将获得与ojit_a相同的不合格结果,但是gcc less than the most HEAD也是固定的。
还要注意,clang 4.0 and > live中的问题也仅在Is f().a[0]
an xvalue?中得到了解决。
另请注意gcc HEAD
在C++ 11之后更改为[expr.ref]p4.2:
看起来该更改最初是this的一部分,尽管我不确定它与DR 616有什么关系。
关于c++ - 右值的成员访问运算符应为xvalue吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53160833/