当使用gcc 4.7 (g++-mp-4.7 (GCC) 4.7.0在OS X上用MacPorts构建)编译以下代码时,我得到了似乎相互矛盾的结果。
当我尝试将std::array的一部分作为uint32_t重新解释和取消引用时,编译器不会报错,但在使用C风格的数组时就会报错。
示例代码:
#include <array>
#include <cstdint>
int main() {
std::array<uint8_t, 6> stdarr;
*reinterpret_cast<uint32_t*>(&stdarr[0]) = 0; // OK
uint8_t arr[6];
*reinterpret_cast<uint32_t*>(&arr[0]) = 0;
// ^ error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
}编译器命令是:
$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp为什么他们受到不同的对待?
发布于 2012-05-12 19:52:31
当获取std::array的地址时,表达式arr[0]等同于返回引用的函数调用arr.operator[](0),而不是指针算术表达式(arr + 0)。也许编译器在生成别名警告时不会试图“看穿”operator[]函数调用。
https://stackoverflow.com/questions/10563411
复制相似问题