在cpprefernce 部分:值类别中,它声明“对象表达式的成员,其中 a 是右值,m 是非引用类型的非静态数据成员”是 xvalue。在标准中(我在:N4140,C++14 标准草案中找到)它声明(第 87 页)“如果表达式是 xvalue,则表达式是 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 的行为)。
抱歉,这不是问题……我说的对吗?是否应该更新参考以澄清这种行为?