C++ 取消引用类型双关指针将打破严格的别名规则

C++ 取消引用类型双关指针将打破严格的别名规则,c++,C++,我的问题与我之前提出的问题密切相关: 我在网上看到过不同的警告帖子,但不幸的是,它们没有涵盖我的问题 简而言之,我想在堆栈上声明一些空间,然后将其用作某种类型T的数组,其中T可以是任何类型(尤其是非POD类型),我不能使用C++11 我尝试使用的两个表的声明是: char m_rawMemory[sizeof(T) * _size]; T(& m_tabT)[_size]; 解决我的问题的建议解决方案是: union Data { Data() {} T values

我的问题与我之前提出的问题密切相关:

我在网上看到过不同的警告帖子,但不幸的是,它们没有涵盖我的问题

简而言之,我想在堆栈上声明一些空间,然后将其用作某种类型T的数组,其中T可以是任何类型(尤其是非POD类型),我不能使用C++11

我尝试使用的两个表的声明是:

char m_rawMemory[sizeof(T) * _size];
T(& m_tabT)[_size];
解决我的问题的建议解决方案是:

union Data {
    Data() {}
    T values[Size];
} data;
如果不是这样,那就太好了,我不能使用C++11,因为我的编译器不支持无限制的联合(用于嵌入式环境的程序),所以与POD不同的类型将无法编译

因此,我决定创建char表,并按以下方式使用它:

m_tabT(reinterpret_cast<T(&)[_size]>(m_rawMemory)
m_tabT(重新解释投射(m_rawMemory)
这是汇编,但在标题中给出了警告。因此,我的问题是:

为什么我会收到这个警告?
如何正确地做到这一点?

我认为有很多资源可以解释违反严格别名规则的问题。阅读您之前的问题,在我看来,您可以使用
vector
,传入一个分配器,返回指向“堆栈”的指针,而不是模仿
array
已分配内存。别名规则意味着您重新解释到的类型可以有不同(更严格)的对齐规则并触发硬件异常。请尝试从
T[]以另一种方式重新解释它
char*
。我认为有很多资源可以解释违反严格别名规则的问题。阅读您之前的问题,在我看来,您可以使用
vector
,传入一个分配器,返回指向“堆栈”的指针,而不是模拟数组已分配内存。别名规则意味着您重新解释到的类型可以有不同(更严格)的对齐规则并触发硬件异常。请尝试以另一种方式重新解释它,从
T[]
char*