Đây là phần tiếp theo của câu hỏi này: Is it legal to declare a constexpr initializer_list object?.Tại sao không phải `std :: initializer_list` được định nghĩa là một loại chữ?
Vì C++ 14, lớp std::initializer_list
có tất cả các phương pháp được đánh dấu bằng constexpr
. Có vẻ tự nhiên để có thể khởi tạo một cá thể bằng cách thực hiện constexpr std::initializer_list<int> list = {1, 2, 3};
nhưng Clang 3.5 phàn nàn về list
không được khởi tạo bằng biểu thức không đổi. As dyp pointed out in a comment, bất kỳ yêu cầu nào đối với std::initializer_list
là kiểu chữ dường như đã biến mất khỏi các thông số kỹ thuật.
Điểm của việc có một lớp được định nghĩa đầy đủ là constexpr nếu chúng ta thậm chí không thể khởi tạo nó như vậy? Đây có phải là sự giám sát trong tiêu chuẩn và sẽ được sửa chữa trong tương lai không?
Richard Smith dường như ngụ ý [ở đây] (http: //clang-developers.42468.n3.nabble.com/C-11-constexpr-và-initializer-list-td4031078.html) rằng 'std :: initializer_list' đã được tạo thành một kiểu chữ. Tuy nhiên, tôi không thể tìm thấy yêu cầu như vậy trong Tiêu chuẩn. Một câu hỏi thứ hai, mà tôi đã đăng trên một bình luận cho câu hỏi của tôi được liên kết ở trên, là * "Có thể khai báo các hàm thành viên không phải là tĩnh không?" *, Xem [CWG DR 1684] (http: //open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1684) – dyp
Điều này thật kỳ quặc, clang ++ biên dịch nó khi bạn đặt nó trong phạm vi toàn cầu: http://coliru.stacked-crooked.com/a/dab2834181fb8ea4 (Đây là [clang bug 15117] (http://llvm.org/bugs/show_bug.cgi?id=15117)) Mùi giống như một lỗi trình biên dịch khác đối với tôi. – dyp
clang ++ cũng chấp nhận nó khi nó là biến tĩnh cục bộ: http://coliru.stacked-crooked.com/a/700cf33e2446b63c – dyp