2010-03-14 70 views
2

C++如何确定深层次的隐式转换/构建对象? 例如:C++,如何确定隐式转换/构造函数?

struct A {}; 
struct B: A {}; 
struct C { operator B() { return B(); } }; 

void f(A a) {} 

int main(void) 
{ 
    f(C()); 
} 

是否创造一切可能的转换的树,并选择合适的终端?还有别的吗?谢谢

+1

发布一些可编译的代码。如果你编译它,甚至可以回答你的问题。 – 2010-03-14 19:48:06

回答

4

f()的通话将需要两次转换,一个用户自定义转换(CB)和一个内置转换(派生于基:BA)。具有不匹配参数的调用在需要零个或一个用户定义的转换时成功。如果不同的转换(内置或用户定义的)会成功,那么,如果所有可能的方式在他们所需的转换次数/种类上都相同,则调用不明确,编译器需要发出诊断。

编译器是如何实现这一点的不是标准规定的。

+0

谢谢,这是有道理的。你知道什么优先,用户定义的转换,C-> A或构造函数C(A)? – Anycorn 2010-03-14 19:59:04

+0

@aaa:我在这里深表歉意,但TTBOMK,如果两个用户定义的转换是可能的,调用是不明确的,代码不应该编译。 – sbi 2010-03-14 20:00:05

+1

@aaa,请给出完整的代码。在你的代码中,只有一个转换函数存在,并且没有'C(A)'构造函数。我们的分析显示,您的代码至少不错,符合标准。那么“C(A)”呢?我在这里看不到这样的构造函数。 – 2010-03-14 20:14:11

2

标准没有指定这个。它只是说明了结果。每个不同的编译器供应商都可以按照他们选择的方式来实现,只要它们给出正确的结果。

因此,有可能是一大堆不同的方法在那里

相关问题