c++ - 编译器没有发现歧义

标签 c++ ambiguity

我不得不花一些时间来查找和修复我设法在以下代码中隔离的错误:

#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/

相关文章:

c++ - 函数内的指针行为

c++ - 使用静态库编译错误可执行文件

python - 使用 Mechanize 使用 Python 发送 POST 参数

C++:模糊函数

c++ - 为什么 CLion 向我发出警告?

c++ - boost 1.58 未定义引用

c++ - OpenCV OpenGLDrawCallback 没有被调用

java - 编译器没有发现实例变量和构造函数初始化期间传递的参数之间存在歧义?

c++ - to_string(42) 不止一个实例匹配参数