c ++中的两阶段隐式转换

时间:2013-11-20 17:12:29

标签: c++ casting

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 个答案:

答案 0 :(得分:1)

由于您要将C转换为A,因此转换运算符实际上需要为A而不是B.您获得了B,但它不会在没有强制转换的情况下转变为A.但是,将B作为A返回将进行隐式转换。

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

Live example

答案 1 :(得分:1)

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

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

顺便说一下,这里没有演员阵容。强制转换是显式类型转换。