Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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