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