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

Overload resolution of constructors for different classes

考虑这段代码。

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}的精确匹配,而第二个需要整数提升,而最后一个需要浮点数转换。

那么为什么会出现歧义呢?

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

[over.ics.user]

1 A user-defined conversion sequence consists of an initial standard conversion sequence followed by a user-defined conversion ([class.conv]) followed by a second standard conversion sequence.

隐式转换序列中任意位置的用户定义转换赋予整个序列一个 "user defined conversion" 等级。所以这两个转换序列实际上是同一等级的,因此没有一个比另一个更好。

因此函数调用不明确。

这是因为整数可以转换为双精度,因为双精度是一个更大的数据类型。它被称为隐式转换。

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