我有这段代码,编译得很好:
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?
最佳答案
在重载分辨率期间,选择最佳可行函数时,编译器将选择具有最佳转换序列的过载。
在两个比较重载的参数是引用绑定(bind)的情况下,标准根据[over.ics.rank]/3.2.3定义了什么是最好的绑定(bind)。至 [over.ics.rank]/3.2.6 .这些规则使编译器能够选择 foo(int&)
或 foo(int&&)
是否更适合给定的参数类型。
但是没有规则可以指定按值传递的参数是否优于绑定(bind)到引用参数的参数。因此,对于所有重载都通过引用或值获取 int
的简单情况,如果参数不是 const,则调用 foo
将始终不明确。 (如果参数类型是 const 限定的,foo(int&)
和 foo(int&&)
不是可行的重载)。
关于c++ - 由于引用,重载调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385611/