2013-11-20 76 views
0

C++标准中没有指出我可以隐式转换两次的东西吗?即如果我的函数需要对象A并且我用对象C调用它,即使C和A之间没有直接转换,但是C到B之间以及从B转换为A,也不会得到编译错误?在人生的某个时候,尽管这段代码是合法的,但今天我发现我错了。C++中的两阶段隐式转换

class A {}; 

class B { 
    A m_a; 
public: 
    operator A() { return m_a; } 
}; 

class C { 
    B m_b; 
public: 
    operator B() { return m_b; } 
}; 


void f(A a){} 

int main() 
{ 
    C c; 
    f(c); 
    return 0; 
} 
+1

顺便说一句,您在类'B'中缺少'operator A' – kfsone

+0

此代码中没有**强制转换**。有**隐式转换**。强制转换是您在源代码中编写的内容,以告知编译器进行转换。 –

回答

1

的隐式转换只能涉及单个用户定义的转换。在用户定义的转换之前和/或之后,它还可以包含内置转换(例如intlong)。

您的代码是无效的,因为它需要两个用户定义的转换,CBA(假设你的意思是说operator ABoperator int)。这样做有一个很好的理由:为了允许两次转换,编译器必须尝试每种可能的中间类型,并且有无数种可能的类型。

顺便说一下,这里没有涉及到的演员。演员阵容是明确的类型转换。

+0

因此,如果它们中的一个是内置转换,它可以是两阶段? – Mehrdad

+0

@Mehrdad:是的,只要转换是明确的。如果'C'可转换为'int'(并且没有其他整数类型),'f'需要'long',那么'f(C)'将'C'转换为'int'为'long'没事的。 –

+0

好的,谢谢你的回复,现在我明白了,一个用户定义了一个,另一个用户定义了 – e271p314

1

既然你要转换CA,转换运营商实际需要的是A,不B.你得到一个B,但它并没有浇注变成一个A。但是,将B作为A返回将执行隐式转换。

class C { 
    B m_b; 
public: 
    operator A() { return m_b; } 
}; 

Live example

+0

好的,我明白了,隐式转换正在返回一种类型的对象,而运算符的返回类型不同 – e271p314