c++ - 为什么传递右值引用 (X&&) 就像传递左值引用 (X&)?

标签 c++ c++11 language-lawyer rvalue-reference rvalue

在研究右值引用的过程中,我从stackoverflow找到了一个奇怪的答案.

提问者希望避免一个接收左值引用参数的函数与另一个接收右值引用的函数之间的代码重复。这两个函数做同样的事情。

这里是问题:-

void foo(X& x)  { /*complex thing*/       }      //#A
void foo(X&& x) { /*complex SAME thing*/  }      //#B

这是建议的解决方案。我稍微修改了一下:-

void foo(X& x)  {  /*complex thing*/ }      //#A
void foo(X&& x) { foo(x);            }      //#B

问题

为什么我的版本不会导致栈溢出异常?
在我的版本中,为什么 foo#B 调用 foo#A 而不是 foo#B

更具体地说,哪个 C++ 规则强制执行此行为?

最佳答案

根据value categories的规则,作为命名参数,x 是一个 lvalue .然后 foo#A 将被调用,因为 x 可以绑定(bind)到左值引用,但不能绑定(bind)到右值引用。

请注意,x 被声明为右值引用这一事实与 x 的值类别无关。

lvalue

The following expressions are lvalue expressions:

  • the name of a variable or a function in scope, regardless of type, such as std::cin or std::endl. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;

您可以使用 std::move 使其成为 xvalue (右值),然后 foo#B 将被选中(如您所料)。

关于c++ - 为什么传递右值引用 (X&&) 就像传递左值引用 (X&)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414683/

相关文章:

c++ - 有没有办法检测混合类型和非类型的任意模板类?

c++ - 在 CodeBlocks 中的 Windows 8 上的 cygwin64 下使用 strptime

templates - C++/C++11 - 可变参数模板的 Switch 语句?

c++ - 将当前日期精确到毫秒

c++ - std::copy 在指向 volatile 数据的指针上

c++ - 将非 constexpr 标准库函数视为 constexpr 是否符合编译器扩展?

c++ - 同一模板的不同模板实例之间的转换

c++ - 如何返回派生类型?

c++ - 如何做类似 "is_atomically_assignable"的事情?

c++ - "auto x = vector<int>()"和 "vector<int> x"有什么区别?