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?
Đ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
@juanchopanza Tính năng này có hoạt động với '-Queanh-aliasing = 2' không? – StackedCrooked
Vâng, đúng vậy. Thậm chí không có cảnh báo. – juanchopanza