由于引用,重载的调用是不明确的
call of overloaded is ambiguous because of references
我有这段代码,编译得很好:
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&&)
不是可行的重载)。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 重载类方法的不明确调用
- C++ 如何重载 [] 运算符并进行函数调用
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么初始化时没有调用重载赋值运算符?
- 如何调用用于重载运算符"<<"的 friend 函数?
- 模板化类如何解析在其类型之一上调用的重载非成员函数?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- C++:对函子重载调用运算符的未定义引用
- 重载调用是不明确的:一对内联映射作为构造函数参数
- C++模板重载调用
- 使用子类型重载调用函数
- 从新重载调用构造函数和直接调用构造函数有什么区别?
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 如何重载调用自身重载版本的函数
- 重载调用是二义性的
- C++运算符重载:调用默认函数