c+中的两相隐式铸造+; < C++中没有什么东西表示我可以隐式地投两次吗?i、 e.如果我的函数接受对象A,我用对象C调用它,我不会得到编译错误,即使C和A之间没有直接转换,但有从C到B和从B到A的转换?在生活中的某个时刻,我认为这个代码是合法的,但今天我发现我错了 A类{}; B类{ A m_A; 公众: 运算符A(){return m_A;} }; C类{ B m_B; 公众: 运算符B(){return m_B;} }; 无效f(A){} int main() { C C; f(c); 返回0; }
由于要将c+中的两相隐式铸造+; < C++中没有什么东西表示我可以隐式地投两次吗?i、 e.如果我的函数接受对象A,我用对象C调用它,我不会得到编译错误,即使C和A之间没有直接转换,但有从C到B和从B到A的转换?在生活中的某个时刻,我认为这个代码是合法的,但今天我发现我错了 A类{}; B类{ A m_A; 公众: 运算符A(){return m_A;} }; C类{ B m_B; 公众: 运算符B(){return m_B;} }; 无效f(A){} int main() { C C; f(c); 返回0; },c++,casting,C++,Casting,由于要将C转换为A,因此转换运算符实际上需要是A,而不是B。您得到了B,但如果不进行强制转换,它不会变成A。但是,将B返回为A将执行隐式转换 class C { B m_b; public: operator A () { return m_b; } }; 隐式转换只能涉及单个用户定义的转换。它还可以包含用户定义转换之前和/或之后的内置转换(例如int到long) class C { B m_b; public: operator A () { return m_b; } };
C
转换为A
,因此转换运算符实际上需要是A,而不是B。您得到了B,但如果不进行强制转换,它不会变成A。但是,将B返回为A将执行隐式转换
class C {
B m_b;
public:
operator A () { return m_b; }
};
隐式转换只能涉及单个用户定义的转换。它还可以包含用户定义转换之前和/或之后的内置转换(例如
int
到long
)
class C {
B m_b;
public:
operator A () { return m_b; }
};
您的代码无效,因为它需要两次用户定义的转换,C
到B
到A
(假设您的意思是操作符A
而不是操作符int
)。这有一个很好的理由:为了允许两次转换,编译器必须尝试每种可能的中间类型,并且可能的类型有无限多
顺便说一下,这里没有演员阵容。强制转换是一种显式类型转换。顺便说一句,在类
B
中缺少运算符A
,此代码中没有强制转换。有隐式转换。强制转换是你在源代码中编写的东西,用来告诉编译器进行转换。因此,如果其中一个是内置转换,它可以是两个阶段?@Mehrdad:是的,只要转换是明确的。如果C
可以转换为int
(并且没有其他整数类型),并且f
想要一个long
,那么f(C)
,将C
转换为int
到long
,就可以了。好的,谢谢你参考我的记忆,现在我明白了,一个用户定义的和一个内置的,关于您提到的原因的注释,我不确定有无限多的类型,如果有,那么即使一次转换也会导致编译永远运行。鉴于存在n
可能的类型,我们正在查看n^2
可能的转换。@e271p314:类型集包括void
、void*
、void**
等,这些类型是无限的。只有一个转换,不需要检查所有类型:编译器知道被转换的表达式的类型,并且转换的类型,所以没有必要考虑其他类型。好,我明白了,隐式转换是返回一种类型的对象,而操作符的返回类型不同。
class C {
B m_b;
public:
operator A () { return m_b; }
};