使用std::forward解决问题。
在重载函数调用时,当传递参数是右值时,可以使用移动语义来获得更好的性能。然而,存在左值转换成右值的隐式类型转换,该转换可能会与重载的函数签名产生歧义。这时就会出现意外的输出。解决方案是使用std::forward,它在正确的时候将左值转换为右值引用。
示例代码:
#include
void overload(int&& x) { std::cout << "rvalue reference: " << x << std::endl; }
void overload(int& x) { std::cout << "lvalue reference: " << x << std::endl; }
template
int main() { int a = 1; forwarding(a); forwarding(2); return 0; }
输出:
lvalue reference: 1 rvalue reference: 2
下一篇:不同的语法错误在输出中隐藏了行。