【发布时间】:2016-12-31 21:58:37
【问题描述】:
如果您将旧的 C 风格从 A 类型转换为 B 类型,而 A 类型不能转换为 B 类型,反之亦然,C++ 标准是否定义了特定的行为?
是否存在已知的可见行为,可以被认为是运行时非法强制转换的症状?
【问题讨论】:
-
我认为你应该提供一个例子。例如:您是在谈论 POD 类型、类、原始类型、指针……吗?
-
C 风格的转换可以等效于 3 种不同的 C++ 转换(
static_cast、reinterpret_cast或const_cast)中的任何一种,具体取决于实际代码。其中static_cast会引发编译时错误,而reinterpret_cast会(在大多数情况下)导致 UB(如果强制转换是非法的) -
您可能会发现您得到“未定义的行为”,并且“未定义的行为”没有标准症状 - 程序的行为与您预期或预期的不同,但这就是您的全部可以说。使用某些编译器,它甚至可能会像您预期的那样运行;尽管有可能,但它们中的任何一个都没有义务出错。
-
如果没有从 A 到 B 的等效 c++ 转换,则 c 样式转换将失败。
-
@MikeMB 失败是指编译时错误还是未定义的运行时行为?因为正如其他答案所述,您实际上可以在等效转换是非法的 c 风格中进行转换。
标签: c++