在研究右值引用时,我从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的值类别无关。



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

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

10-09 13:16