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;
}
答案 0 :(得分:1)
由于您要将C
转换为A
,因此转换运算符实际上需要为A而不是B.您获得了B,但它不会在没有强制转换的情况下转变为A.但是,将B作为A返回将进行隐式转换。
class C {
B m_b;
public:
operator A () { return m_b; }
};
答案 1 :(得分:1)
隐式转换只能涉及单个用户定义的转换。它还可以在用户定义的转化之前和/或之后包含内置转化(例如int
到long
)。
您的代码无效,因为它需要两次用户定义的转化,C
到B
到A
(假设您的意思是operator A
而不是{{}在operator int
)中的1}}。这有一个很好的理由:允许两次转换,编译器必须尝试每种可能的中间类型,并且有无数种可能的类型。
顺便说一下,这里没有演员阵容。强制转换是显式类型转换。