不同 类 构造函数的重载解析
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)
。
考虑这段代码。
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)
。