Các mã sau biên dịch và chạy trong gcc 4.9.1 và Clang-3.6 khi sử dụng -std = C++ 11:khởi của mảng thành viên constexpr tĩnh trong gcc 4.8
struct Bar
{
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
Tuy nhiên, nó không thành công trong gcc 4.8.3, kết quả được thông báo lỗi
./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar'
static constexpr Bar bars[] = {1, 2, 3};
^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar'
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar'
Ngẫu nhiên, nếu tôi làm điều tương tự nhưng làm bars
một mảng toàn cầu const tĩnh, nó biên dịch tốt trong gcc 4.8 và kêu vang. Nó cũng sẽ biên dịch tốt nếu tôi bao quanh từng chữ số nguyên trong danh sách với một cặp phụ là {}
.
Vì vậy, đây có phải là lỗi trong gcc 4.8 không? Tiêu chuẩn nói gì là cú pháp thích hợp cho điều này? Phần nào của tiêu chuẩn khởi tạo đồng nhất C++ 11 đang được gọi khi tôi bỏ qua các dấu ngoặc phụ thừa?
Chỉnh sửa: Có vẻ như tiêu chuẩn nói rằng điều này nên gọi khởi tạo tổng hợp, cho phép "giải phóng cú đúp". Vì vậy, có vẻ như đó là lỗi trong gcc 4.8, được sửa bởi gcc 4.9, nhưng tôi hoàn toàn không tự tin khi đọc tiêu chuẩn. Tôi cũng không thể tìm thấy bất kỳ báo cáo lỗi nào trong trình theo dõi lỗi của gcc về vấn đề này, vì vậy tôi có thể dễ dàng bị sai.
Bạn có cho rằng đó là lỗi đã được khắc phục không? – edmz