Tôi tình cờ gặp mã mà tôi không hiểu. Đây là phiên bản được đơn giản hóa của nó:C++ 98 dấu ngoặc ôm const khởi tạo vô hướng
template <int> struct A {};
int const i = { 42 };
typedef A<i> Ai;
int const j = 42;
typedef A<j> Aj;
Mã này biên dịch với chế độ GCC ở chế độ C++ 98, chứ không phải trong Clang. Clang tạo ra lỗi sau:
$ clang -Wall -Wextra -std=c++98 -c test.cpp
test.cpp:4:11: error: non-type template argument of type 'int' is not an integral constant expression
typedef A<i> Ai;
^
test.cpp:4:11: note: initializer of 'i' is not a constant expression
test.cpp:3:11: note: declared here
int const i = { 42 };
^
Theo tôi hiểu việc khởi tạo int
có và không có dấu ngoặc nhọn phải tương đương. Clang khởi tạo i
chính xác đến 42
, chỉ không nghĩ đó là hằng số thời gian biên dịch.
Mã này biên dịch tốt ở chế độ C++ 11.
Có lý do nào j
được coi là hằng số thời gian biên dịch và i
không? Hay đơn giản là một con bọ ở Clang?
Cập nhật: Tôi đã mở ticket trong trình theo dõi lỗi LLVM với sự cố này.
tôi sẽ nói đó là một lỗi trong trình biên dịch. – Raxvan
@Raxvan: Đó là một tuyên bố khá táo bạo ... Xem xét nó hoạt động trong C++ 11 và không có trong C++ 98 nó có vẻ khá thận trọng, vì vậy tôi thực sự mong đợi nó sẽ * theo thông số kỹ thuật * (trên phần Clang) và gcc trở nên khoan dung hơn bình thường. –
@MatthieuM .: Tôi nghĩ rằng đây là những gì anh ấy muốn nói: một lỗi trong gcc. Không có cú pháp C++ 98 cho điều này, và clang rightfully từ chối nó. Vì vậy, chấp nhận nó trong gcc, mặc dù không phải là C++ 98, là một lỗi. – PlasmaHH