严格的混叠规则违反

Strict aliasing rule violation

本文关键字:规则      更新时间:2023-10-16

在这个isocpp.org常见问题链接中提供的示例中,一个Fred对象正在被构造,其位置为一个缓冲区,该缓冲区正在分配给另一个对象,即

char memory[sizeof(Fred)]

据我所知,严格的混叠规则允许我们做相反的事情,即对于任何类型的对象,我们都允许在它处有一个char*点,我们可以解引用该指针并按我们想要的方式使用它。

但是在这个例子中,情况正好相反。我错过了什么?

严格的混叠规则没有提到Fred*必须转换为char*。只有char*Fred*类型的变量可以指向同一个对象,并且可以用来访问它。

引用(基本。第8段

如果程序试图通过该行为不是下列类型之一的全局值定义:

  • 对象的动态类型,

    [. .]

  • char或unsigned char类型。

place -new创建一个新对象。它不会别名旧对象。当placement-new执行时,旧对象(本例中的char数组)被认为不再存在。

在place_new之前,有一个存储空间被char对象填充。在place -new之后,存储空间被一个Fred对象填充。

由于没有混叠,所以没有严格混叠问题