c++中的两相隐式铸造

Two phase implicit casting in c++

本文关键字:c++      更新时间:2023-10-16

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;
}

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

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

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

由于要将C转换为A,因此转换运算符实际上需要是A,而不是B。您得到了一个B,但如果不进行强制转换,它不会变成A。但是,将B作为A返回将进行隐式转换。

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

实例

相关文章:
  • 没有找到相关文章