不同类的构造函数的重载解析

Kar*_*yan 9 c++ constructor initializer-list overload-resolution c++11

考虑下面的代码。

struct A {
    int i;
};

struct B {
    char c;
};

struct C {
    double d;
};

void f(A a);
void f(B b);
void f(C c);

void g()
{
    f({5});
}
Run Code Online (Sandbox Code Playgroud)

在这里,我感到模棱两可f({5});。但似乎struct A的构造函数与完全匹配{5},而第二个则需要整数提升,而最后一个需要浮点转换。

那么为什么会有歧义呢?

Sto*_*ica 7

即使序列中的第一个转换的排名较差,两个转换序列最终还是用户定义的转换,因为它们都转换为用户定义的类型。

[over.ics.user]

1用户定义的转换序列由一个初始标准转换序列,一个用户定义的转换([class.conv])和一个第二个标准转换序列组成。

用户定义的转换在隐式转换序列中的任何位置都会为整个序列提供“用户定义的转换”等级。因此,这两个转换序列实际上具有相同的等级,因此两者都不比另一个更好。

因此,函数调用是不明确的。