3

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

#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-function 创建的被忽略的(由我和编译器(?))歧义引起的:f2清楚地表明 bothf1(A)f1(std::string)apply to A,但是编译时编译器不会拾取歧义,并且在执行时输出是:

f1:a.S = test
f1:s = test
f2:a.S = test
f2:a.S = test

这种行为正确吗?编译器问题?还是只是普通的旧 PIBCAK?

4

1 回答 1

8

您描述的行为是预期的:没有歧义。当两个重载匹配得一样好并且都是“最佳重载”时,就会出现重载解决歧义。

当您f1使用 type 的参数调用时A,第一个f1是完全匹配;第二个f1根本不匹配。因此,f1显然在重载解决方案中获胜。

当您f1使用类型的参数调用时std::string,第一个f1通过 ; 的转换构造函数匹配A。第二个f1是完全匹配。第二个f1是更好的匹配:它是完全匹配,不需要转换。这两个重载的匹配并不相同,因此没有歧义。第二个f1在重载解决期间获胜。

于 2012-11-25T19:33:45.783 回答