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

时间:2019-06-10 07:48:58

标签: c++ c++11 constructor initializer-list overload-resolution

考虑此代码。

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});
}

我在f({5});中含糊不清。但是似乎struct A的构造函数与{5}完全匹配,而第二个构造函数需要整数提升,而最后一个则需要浮点转换。

那为什么会有歧义?

2 个答案:

答案 0 :(得分:7)

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

  

[over.ics.user]

     

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

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

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

答案 1 :(得分:-2)

这是因为整数可以转换为double,因为double是较大的数据类型。这称为隐式转换。

此函数调用g()f(C c)都可以转到f(A a)