严格别名规则违规

时间:2016-10-16 12:40:44

标签: c++ strict-aliasing

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

char memory[sizeof(Fred)]

正如我所知,严格的别名规则允许我们做相反的事情,即对于任何类型的对象,我们被允许有一个char*点,我们可以取消引用该指针并按我们的意愿使用它

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

2 个答案:

答案 0 :(得分:2)

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

引用[basic.lval] paragraph 8

  

如果程序试图通过访问对象的存储值   行为是除以下类型之一以外的glvalue   未定义:

     
      
  • 对象的动态类型

         

    [..]

  •   
  • char或unsigned char类型。

  •   

答案 1 :(得分:1)

Placement-new创建一个新对象。它不会对旧对象进行别名。当placement-new执行时,旧对象(此示例中为char数组)被视为停止存在。

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

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