严格的别名和std :: array与C
当使用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
他们为什么对待不同?
当获取std::array
的地址时,表达式arr[0]
等价于函数调用arr.operator[](0)
,它返回一个引用,而不是指针算术表达式(arr + 0)
。 也许编译器在生成别名警告时不会试图“看透” operator[]
函数调用。
上一篇: Strict aliasing and std::array vs C
下一篇: Pattern matching on object.member in Play 2.0 templates