interpret_cast到C++中的聚合类型

reinterpret_cast to aggregate type in C++

本文关键字:类型 C++ cast interpret      更新时间:2023-10-16

关于通过类型为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的表示,但不知何故,我怀疑这是否应该被定义为行为?

这不是定义的行为。C样式的强制转换可以是任何类型,在本例中,它是一个reinterpret_cast。这个演员阵容告诉编译器,"我知道我在做什么,尽管你可能不这么想,想告诉我这件事。"但在这种情况下,编译器是对的,而你是错的。。。但编译器会听,让你在寺庙里开枪自杀。