当我使用g编译此示例代码时,我收到此警告:
警告:解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing]
代码:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
在这种情况下, data
是否为别名,因此将其强制转换为int不会违反严格的别名规则?或者我在这里遗漏了什么?
编辑:奇怪,当我像这样定义 data
时:
alignas(int) char* data = new char[sizeof(int)];
编译器警告消失了 . 堆栈分配是否与严格别名产生差异?事实上它是 char[]
而不是 char*
意味着它实际上不能为任何类型别名?
2 回答
警告是绝对合理的 . 指向
data
的衰减指针执行 not point to an object of type int ,并且转换它不会改变它 . 见[basic.life]/7:新对象不是
char
的数组,而是int
. P0137,它正式化了指向的概念,增加了launder
:即你的片段可以这样纠正:
..或者只是从placement new的结果中初始化一个新指针,这也会删除警告 .
改变怎么样?
至
?
在我的情况下,它摆脱了警告 .