【发布时间】:2017-05-15 20:14:51
【问题描述】:
在研究右值引用时,我从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++ 规则强制执行此行为?
【问题讨论】:
-
"什么是强制执行这种奇怪行为的 C++ 规则" 你是什么意思?你的意思是哪个规则或规则集定义了这种行为?
-
@juanchopanza 我的意思是官方的语法规则。这就像 C++ 的法则。我不知道怎么称呼它。
-
试试
void foo(X&& x) { foo(std::move(x)); }。 -
@Zereges 不行,这样毁了我脆弱的电脑实在是太慷慨了。
-
您确实应该在问题中提供更多上下文。例如,您引用的问题可能会被删除,然后这个问题就不再有意义了。
标签: c++ c++11 language-lawyer rvalue-reference rvalue