在c++标准中有没有规定我可以隐式地强制转换两次?也就是说,如果我的函数接受对象A,而我用对象C调用它,即使C和A之间没有直接强制转换,但有从C到B和从B到A的强制转换,我也不会得到编译错误?在生活中的某个时候,我认为这段代码是法律的的,但今天我发现我错了。
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;
}
2条答案
按热度按时间s1ag04yj1#
隐式转换只能涉及单个用户定义转换。它还可以在用户定义转换之前和/或之后包含内置转换(如
int
到long
)。您的代码是无效的,因为它需要两个用户定义的转换,
C
到B
到A
(假设您的意思是operator A
,而不是B
中的operator int
)。为了允许两次转换,编译器将必须尝试每一种可能的中间类型,并且存在无限数量的可能类型。顺便说一下,这里没有涉及到类型转换,类型转换是一种显式类型转换。
py49o6xq2#
由于要将
C
转换为A
,因此转换操作符实际上需要是A,而不是B。您得到了B,但如果不进行强制转换,它不会变成A。然而,将B作为A返回将执行隐式转换。Live example