C++ 重载的调用由于引用而不明确

C++ 重载的调用由于引用而不明确,c++,function,reference,overloading,ambiguous,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"

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

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

void foo(int x){std::cout在重载解析期间,当选择最佳可行函数时,编译器将选择具有最佳转换序列的重载

在两个比较重载的参数为引用绑定的情况下,标准根据定义了最佳绑定。这些规则使编译器能够选择
foo(int&)
还是
foo(int&)
更适合给定的参数类型


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

它有什么不明确的地方?@smac89尝试调用foo(0);或foo(n);保留第一个或第三个。这就是造成歧义的原因。简言之,删除第一个overload@smac89实际上,我添加了第三个foo只是为了在这个问题中增加额外的内容。如果我只有int和int&我知道我可以使用foo(0),因为没有歧义。但是对于foo(n),仍然有歧义。我知道我可以只使用一个foo。(又称重命名)但是我注意到C++允许这种模糊的超载来编译。所以这就是我要问的。你打算怎么使用它?@ PutdDip是一个空气芽的情况。规则中没有任何东西表明你不允许产生冲突的重载。这就是它的全部内容。