关于通过类型AliasedType*
的指针访问对象的安全性,C ++ 11标准声明以下是安全的(§3.10.10):
AliasedType是一种聚合类型或联合类型,它将上述类型之一保存为元素或非静态成员(包括,递归地,包含联合的子聚合和非静态数据成员的元素)。
我完全得到了联盟的一部分,但究竟是什么让我了解了聚合类型?我(我想)知道我可以在指向聚合类型的指针和指向其第一个成员的指针之间自由转换,但是这个规则似乎允许更多的转换。
我尝试了以下内容:
struct bar {
int a;
float b;
int c;
};
int main() {
bar s {1,2,3};
cout << hex << ((bar*)&s.b)->a << endl;
}
结果是40000000,这意味着我将b
表示为int,但不知何故我怀疑这应该是定义的行为吗?
答案 0 :(得分:0)
未定义的行为。 C风格的演员阵容可以是任何东西,在这种情况下它是reinterpret_cast。这个演员告诉编译器,&#34;我知道我在做什么,即使你可能会想到并且想告诉我它。&#34;但在这种情况下,编译器是正确的,你错了......但编译器会监听并让你自己在寺庙中射击。