C++ 如何确定几层深的对象的隐式转换/构造?例如:
struct A {};
struct B: A {};
struct C { operator B() { return B(); } };
void f(A a) {}
int main(void)
{
f(C());
}
它是否创建所有可能转换的树并选择适当的终端?还有什么?谢谢
C++ 如何确定几层深的对象的隐式转换/构造?例如:
struct A {};
struct B: A {};
struct C { operator B() { return B(); } };
void f(A a) {}
int main(void)
{
f(C());
}
它是否创建所有可能转换的树并选择适当的终端?还有什么?谢谢
调用f()
将需要两次转换,一次是用户定义的转换 ( C
to B
),一次是内置转换 (derived-to-base: B
to A
)。当需要零次或一次用户定义的转换时,使用不匹配参数的调用会成功。如果不同的转换(内置的或用户定义的)会成功,那么,如果所有可能的方法在他们需要的转换数量/种类上都相等,则调用是不明确的,编译器需要发出诊断。
标准没有指定编译器如何实现这一点。
标准没有规定这一点。它只指定结果。每个不同的编译器供应商都可以以他们选择的任何方式实现这一点,只要他们给出正确的结果。
所以可能有很多不同的方法