2012-05-12 22 views
7

Khi biên dịch mã sau với gcc 4.7 (g ++ - mp-4.7 (GCC) 4.7.0 được tạo bằng MacPorts trên OS X), tôi nhận được kết quả dường như mâu thuẫn.Bí danh và tiêu chuẩn nghiêm ngặt :: mảng vs mảng kiểu C

Trình biên dịch không phàn nàn khi tôi cố gắng diễn giải lại và dereference một phần của std::array dưới dạng uint32_t nhưng nó thực hiện khi sử dụng mảng kiểu C.

Ví dụ mã:

#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] 
} 

trình biên dịch lệnh là:

$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp 

Tại sao họ đối xử khác biệt?

+0

Điều thú vị là tôi không gặp bất kỳ lỗi nào trên gcc 4.7 trên ubuntu 12.04, 64 bit. – juanchopanza

+0

@juanchopanza Tính năng này có hoạt động với '-Queanh-aliasing = 2' không? – StackedCrooked

+0

Vâng, đúng vậy. Thậm chí không có cảnh báo. – juanchopanza

Trả lời

3

Khi lấy địa chỉ của std::array, biểu thức arr[0] tương đương với hàm gọi arr.operator[](0) trả về tham chiếu thay vì biểu thức số học con trỏ (arr + 0). Có lẽ trình biên dịch không cố gắng "xem qua" cuộc gọi hàm operator[] khi tạo cảnh báo răng cưa.

Các vấn đề liên quan