考虑此代码。
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}
完全匹配,而第二个构造函数需要整数提升,而最后一个则需要浮点转换。
那为什么会有歧义?
答案 0 :(得分:7)
即使序列中的第一个转换的排名较差,两个转换序列最终都是用户定义的转换,因为它们都转换为用户定义的类型。
[over.ics.user]
1用户定义的转换序列由初始标准组成 转换顺序,然后是用户定义的转换 ([class.conv])后跟第二个标准转换序列。
隐式转换序列中任何位置的用户定义转换都会使整个序列具有“用户定义转换”等级。因此,这两个转换序列实际上具有相同的等级,因此两者都不比另一个更好。
因此,函数调用是不明确的。
答案 1 :(得分:-2)
这是因为整数可以转换为double,因为double是较大的数据类型。这称为隐式转换。
此函数调用g()
和f(C c)
都可以转到f(A a)
。