7

当使用 gcc 4.7(在 OS X 上使用 MacPorts 构建的 g++-mp-4.7 (GCC) 4.7.0)编译以下代码时,我得到看似矛盾的结果。

当我尝试将 an 的一部分重新解释和取消引用std::array为 an时,编译器不会抱怨,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

为什么他们会受到不同的对待?

4

1 回答 1

3

取地址时std::array,表达式arr[0]相当于arr.operator[](0)返回引用的函数调用,而不是指针算术表达式(arr + 0)operator[]也许编译器在生成别名警告时不会尝试“看穿”函数调用。

于 2012-05-12T11:52:30.787 回答