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

Overload resolution of constructors for different classes

本文关键字:重载 构造函数 同类      更新时间:2023-10-16

请考虑此代码。

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}完全匹配,而第二个需要积分提升,而最后一个需要浮点转换。

那么为什么会有歧义呢?

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

[结束.ics.用户]

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

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

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

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

这个函数调用g()可以转到f(C c),也可以转到f(A a)