c++ - 由于引用,重载调用不明确

标签 c++ function reference overloading ambiguous

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

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/

相关文章:

c++ - 如何将 win32 应用程序迁移到 x64 应用程序?

java - 使用 JNI 将列表 <unsigned char*> 从 C++ 返回到 Java

c++ - WriteFile/ReadFile 死锁

c++ - 'deep' 模板参数推导是否可行?

javascript - 为什么我会收到 .replace 不是函数的错误消息?

c++ - 为什么编译器可以通过引用传递和值传递来重载函数

windows-phone-7 - 带有 7.1 引用的 Windows Phone 8 应用程序

PHP 正在访问嵌套数组并复制它们?

rust - 为什么不能在同一结构中存储值和对该值的引用?

javascript - Click() jQuery 函数不适用于简单的 div