为什么使用 xvalue 对象表达式 [expr]/7.3 的类成员访问规则不应应用于引用类型?
连同 [expr.ref]/4
“如果 E2 被声明为具有“对 T 的引用”类型,则 E1.E2 是一个左值;E1.E2 的类型是 T。”
在没有明显原因的情况下更改过期信息。
有人知道这个决定的原因吗?
#include <utility>
int i;
struct { int && m; } a { std::move (i) };
typedef decltype ((std::move (a).m)) M;
// M is int &, not &&
static_assert ((std::is_same <M, int &>::value), "");
int main () {}
我想我一开始之所以感到困扰是因为它打破了转发类成员的简单解决方案:
template <typename U> auto f (U && u)
-> decltype ((static_cast <U &&> (u).m))
{
return static_cast <U &&> (u).m;
}
没有任何明显的替代方案,除了求助于更复杂的类型特征解决方案。
最佳答案
如果您考虑左值和左值之间的差异,以及它对 struct X { T& r; };
允许引用值发生的成员:
左值永远不会被移动,所以你不会意外地从成员引用的变量中移动,这样更安全,因为同一个变量可能会被许多地方引用,而且它们可能是为了合作/以某种方式协调:移动语义不合作,因为遗留值不确定
左值可以获取其地址:为什么您不能获取引用变量的地址?
您可以创建对左值的新引用:使它们引用相同的变量
X::r
references
关于c++ - 在访问引用类型的成员时总是使用左值是什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35912812/