在提供的示例中的link from the isocpp.org faq中,正在构造一个Fred对象,其中将一个新的位置放置到为另一个对象分配的缓冲区,即
char memory[sizeof(Fred)]
正如我所知,严格的别名规则允许我们做相反的事情,即对于任何类型的对象,我们被允许有一个char*
点,我们可以取消引用该指针并按我们的意愿使用它
但是在这个例子中正好相反。我错过了什么?
答案 0 :(得分:2)
严格别名规则未提及必须将Fred*
强制转换为char*
。只有char*
和Fred*
类型的变量可能指向同一个对象,并用于访问它。
如果程序试图通过访问对象的存储值 行为是除以下类型之一以外的glvalue 未定义:
对象的动态类型
[..]
char或unsigned char类型。
答案 1 :(得分:1)
Placement-new创建一个新对象。它不会对旧对象进行别名。当placement-new执行时,旧对象(此示例中为char
数组)被视为停止存在。
在placement-new之前,存储有char
个对象。在placement-new之后,存储中填充了一个Fred
对象。
由于没有别名,因此没有严格别名问题。