C ++如何确定隐含的对象的隐式转换/构造? 例如:
struct A {};
struct B: A {};
struct C { operator B() { return B(); } };
void f(A a) {}
int main(void)
{
f(C());
}
是否会创建所有可能转换的树并选择适当的终端?别的什么?感谢
答案 0 :(得分:4)
对f()
的调用需要两次转换,一次是用户定义的转换(C
到B
)和一次内置转换(派生到基础:{{1到B
)。具有不匹配参数的调用在需要零个或一个用户定义的转换时成功。如果不同的转换(内置或用户定义)成功,那么,如果所有可能的方式在所需的转换数量/类型上相等,则调用是不明确的,并且编译器需要发出诊断。
标准没有规定编译器如何实现这一点。
答案 1 :(得分:2)
标准没有具体说明。它只指定结果。每个不同的编译器供应商都可以以他们选择的任何方式实现它,只要它们给出正确的结果。
所以可能有很多不同的方法