c++ - 在访问引用类型的成员时总是使用左值是什么情况?

标签 c++ c++11 reference lvalue perfect-forwarding

为什么使用 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/

相关文章:

c++ - 通过引用返回时的返回值优化

c++ - 如果我使用选项 -finit-local-zero 编译 Fortran,则 Fortran <-> C++ 互操作性的 Pb

c++ - 是否建议显式地使重写函数成为虚拟的?

java - 如何通过引用让一个Animal对象知道它在哪个Room

c++ - 我有一个指向对象的指针。如何调用需要引用的函数?

c++ - c++11的线程,用new创建

c++ - 如何使用 C++11 标准使 g++ 永久编译?

c++ - 在重载赋值运算符中调用构造函数?

c++ - 每个线程一个类实例,C++11

python - 问题: how to reference to objects/variables created in decorator from injected method?