我有这段代码,可以很好地编译:
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?
答案 0 :(得分:1)
在重载解析期间,当选择最佳可行函数时,编译器将选择具有最佳转换顺序的重载。
如果两个比较的重载的参数是引用绑定,则标准根据[over.ics.rank]/3.2.3至[over.ics.rank]/3.2.6定义最佳绑定。这些规则使编译器可以选择foo(int&)
或foo(int&&)
对于给定的参数类型是否更好。
但是没有规则指定按值传递的参数是否比绑定到引用参数的参数更好。因此,对于这种简单的情况,即所有重载都是通过引用或通过值来占用int
的,如果参数不是const,则调用foo
始终是模棱两可的。 (如果参数类型为const限定,则foo(int&)
和foo(int&&)
不是可行的重载)。