C++中的两阶段隐式造型

kuhbmx9i  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(479)

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

s1ag04yj1#

隐式转换只能涉及单个用户定义转换。它还可以在用户定义转换之前和/或之后包含内置转换(如intlong)。
您的代码是无效的,因为它需要两个用户定义的转换,CBA(假设您的意思是operator A,而不是B中的operator int)。为了允许两次转换,编译器将必须尝试每一种可能的中间类型,并且存在无限数量的可能类型。
顺便说一下,这里没有涉及到类型转换,类型转换是一种显式类型转换。

py49o6xq

py49o6xq2#

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

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

Live example

相关问题