Khi tôi biên dịch mẫu mã này sử dụng g ++, tôi nhận được cảnh báo này:Điều này có thực sự phá vỡ các quy tắc bí danh nghiêm ngặt không?
cảnh báo: dereferencing type-punned con trỏ sẽ phá vỡ quy tắc nghiêm ngặt-aliasing
[-Wstrict-aliasing]
Mã:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
Trong trường hợp này, không phải data
bí danh một int, và do đó đưa nó trở lại một int sẽ không vi phạm quy tắc bí danh nghiêm ngặt? Hay tôi đang thiếu thứ gì đó ở đây?
Edit: Strange, khi tôi xác định data
như thế này:
alignas(int) char* data = new char[sizeof(int)];
Cảnh báo trình biên dịch sẽ biến mất. Việc phân bổ stack có tạo sự khác biệt với tính năng bí danh nghiêm ngặt không? Thực tế là nó là một char[]
và không phải là char*
có nghĩa là nó không thể thực sự bí danh bất kỳ loại nào?
@molbdnilo char * luôn có thể là bí danh –
@ShafikYaghmour Có, tất nhiên. Làm sao tôi có thể quên được? – molbdnilo
Có thể vì 'dữ liệu' đã là bí danh cho' & data [0] '? Ngoài ra 'int const * data;' là một kết hợp gần hơn với 'int data [1];' – rafeek