在学习右值引用时,我在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++规则强制执行此行为?
void foo(X&& x) { foo(std::move(x)); }
。 - Zereges