是否声明类似以下内容
void foo(int x) { std::cout << "foo(int)" << std::endl; }
void foo(const int &x) { std::cout << "foo(const int &)" << std::endl; }
有道理吗?呼叫者如何区分它们?我试过了
foo(9); // Compiler complains ambiguous call.
int x = 9;
foo(x); // Also ambiguous.
const int &y = x;
foo(y); // Also ambiguous.
目的似乎是区分临时调用(即9
)和“常规”参数传递。第一种情况可能允许函数实现采用优化,因为很明显参数将在之后被处理(即绝对地对于整数文字来说毫无意义,但对于用户定义的对象可能有意义)。
然而,当前的 C++ 语言标准没有提供专门针对参数的“左/右值”进行重载的方法 - 任何作为参数传递给函数的左值都可以隐式转换为引用,因此歧义是不可避免的。
C++11 引入了一个用于类似目的的新工具 - 使用r 值引用,您可以按如下方式重载
void foo(int x) { ... }
void foo(const int &&x) { ... }
... and foo(4)
(作为参数传递的临时右值)将导致编译器选择第二个重载,而int i = 2; foo(i)
会选择第一个。
(note:即使使用新的工具链,也无法区分示例中的情况 2 和 3!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)