我不得不花一些时间来查找和修复我设法在以下代码中隔离的错误:
#include <iostream>
struct A
{
std::string S;
A(const std::string s) { S = s; }
};
void f1(A a) { std::cout << "f1:a.S = " << a.S << "\n"; }
void f1(const std::string s) { std::cout << "f1:s = " << s << "\n"; }
void f2(A a) { std::cout << "f2:a.S = " << a.S << "\n"; }
int main()
{
f1(A("test"));
f1(std::string("test"));
f2(A("test"));
f2(std::string("test"));
return 0;
}
错误是由 f1
函数创建的(被我和编译器(?))忽略的歧义引起的:f2
清楚地表明 f1(A)
和 f1(std::string)
适用于 A
,但是在编译时编译器不会发现歧义,并且当执行输出为:
f1:a.S = test
f1:s = test
f2:a.S = test
f2:a.S = test
这种行为是否正确?编译器问题?或者只是普通的旧 PIBCAK?
最佳答案
您描述的行为是预期的:没有歧义。当两个重载匹配得同样好并且都是“最佳重载”时,就会发生重载解析歧义。
当你用A
类型的参数调用f1
时,第一个f1
是完全匹配;第二个 f1
根本不匹配。因此,f1
显然在重载决策期间获胜。
当您使用 std::string
类型的参数调用 f1
时,第一个 f1
通过 的转换构造函数进行匹配一个
;第二个 f1
是完全匹配。第二个 f1
是一个更好的匹配:它是一个完全匹配并且不需要转换。这两个重载匹配得不太好,因此没有歧义。第二个 f1
在重载解析期间获胜。
关于c++ - 编译器没有发现歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554606/