首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >严格的别名和std::array与C风格的数组

严格的别名和std::array与C风格的数组
EN

Stack Overflow用户
提问于 2012-05-12 19:45:10
回答 1查看 495关注 0票数 7

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

当我尝试将std::array的一部分作为uint32_t重新解释和取消引用时,编译器不会报错,但在使用C风格的数组时就会报错。

示例代码:

代码语言:javascript
复制
#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]
}

编译器命令是:

代码语言:javascript
复制
$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp

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

EN

回答 1

Stack Overflow用户

发布于 2012-05-12 19:52:31

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10563411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档