由于引用,重载的调用是不明确的

call of overloaded is ambiguous because of references

本文关键字:重载 调用 不明确 于引用 引用      更新时间:2023-10-16

我有这段代码,编译得很好:

void foo(int x){std::cout << "value copy" << std::endl;} // foo(5) or foo(n)
void foo(int &x){std::cout << "lvalue ref" << std::endl;} // foo(n) only
void foo(int &&x){std::cout << "rvalue ref" << std::endl;} // foo(5) only

但是由于我已经引用了版本,因此它是模棱两可的。
您打算如何使用此功能?我以为编译器会给我一个错误。

我知道我们可以转换函数,但在这种情况下,这似乎毫无意义。
如果你只是要投掷的话,你不妨称他们为 fooL 和 fooR?

在重载解析期间,在选择最佳可行函数时,编译器将选择具有最佳转换序列的重载。

在两个比较重载的参数是引用绑定的情况下,标准根据 [over.ics.rank]/3.2.3 到 [over.ics.rank]/3.2.6 定义什么是最佳绑定。这些规则使编译器能够选择foo(int&)foo(int&&)是否更适合给定参数类型。

但是,没有规则指定按值传递的参数是否优于绑定到引用参数的参数。因此,对于所有重载都通过引用或值int的简单情况,如果参数不是常量,则调用foo将始终是模棱两可的(如果参数类型是 const 限定的,则foo(int&)foo(int&&)不是可行的重载)。