【发布时间】:2015-08-20 02:31:07
【问题描述】:
在 C++ 中,如果 A 和 B 是不同的类,则将 A* 强制转换为 B* 然后取消引用(即给定)通常是未定义的行为
A *a = ...;
写是未定义的行为
((B*)a)->x
即使x 在两个类中具有相同的类型和偏移量也是如此。
另一方面,char* 对强制转换规则有特殊豁免。这样写是不是就说明定义明确了?
((B*)(char*)a)->x
【问题讨论】:
-
它仍然是未定义的行为。
-
不。对不起。通过
char投射并不会神奇地使其合法。 -
类或结构成员的偏移量通常保证为类或结构的第一个成员:它将与结构具有相同的地址,但即使是这个一般规则也可能违反如果类或结构包含虚函数,可能位于第一个成员之前。
-
@rwallace 主要的限制是别名,而不是强制转换。以任何你喜欢的方式投射它,它不会改变你违反别名规则。
-
@rwallace - 既然是C++,为什么不先定义一个基类和普通成员,然后用派生类来处理非普通成员呢?
标签: c++ casting undefined-behavior