违反严格的别名规则

Strict aliasing rule violation

在这个 link from the isocpp.org faq 提供的示例中,正在构造一个 Fred 对象,并将新放置到缓冲区,该缓冲区正在分配给另一个对象,即

char memory[sizeof(Fred)]

据我所知,严格的别名规则允许我们做相反的事情,即对于任何类型的对象,我们都可以有一个 char* 指向它,我们可以取消引用该指针并将其用作我们想要。

但在示例中,情况恰恰相反。我错过了什么?

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

引用 [basic.lval] paragraph 8

If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:

  • the dynamic type of the object,

    [..]

  • a char or unsigned char type.

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

在 placement-new 之前,存储中充满了 char 个对象。在 placement-new 之后,有一个存储空间充满了一个 Fred 对象。

由于没有别名,因此不存在严格别名问题。