在研究右值引用的过程中,我从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/