违反严格的别名规则
Strict aliasing rule violation
在这个 link from the isocpp.org faq 提供的示例中,正在构造一个 Fred 对象,并将新放置到缓冲区,该缓冲区正在分配给另一个对象,即
char memory[sizeof(Fred)]
据我所知,严格的别名规则允许我们做相反的事情,即对于任何类型的对象,我们都可以有一个 char*
指向它,我们可以取消引用该指针并将其用作我们想要。
但在示例中,情况恰恰相反。我错过了什么?
严格的别名规则没有提到 Fred*
必须转换为 char*
。只有 char*
和 Fred*
类型的变量可以指向同一个对象,并用于访问它。
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
对象。
由于没有别名,因此不存在严格别名问题。
在这个 link from the isocpp.org faq 提供的示例中,正在构造一个 Fred 对象,并将新放置到缓冲区,该缓冲区正在分配给另一个对象,即
char memory[sizeof(Fred)]
据我所知,严格的别名规则允许我们做相反的事情,即对于任何类型的对象,我们都可以有一个 char*
指向它,我们可以取消引用该指针并将其用作我们想要。
但在示例中,情况恰恰相反。我错过了什么?
严格的别名规则没有提到 Fred*
必须转换为 char*
。只有 char*
和 Fred*
类型的变量可以指向同一个对象,并用于访问它。
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
对象。
由于没有别名,因此不存在严格别名问题。