#include <iostream>
#include <array>
int main(int argc, char **argv) {
constexpr const std::array<int, 2> arr {{ 0, 1 }};
constexpr const int arr2[] = { 0, 1};
static_assert(arr[0] == arr2[0], "asdf");
static_assert(arr[1] == arr2[1], "asdfasdf");
return 0;
}
Khi biên soạn với gcc 4.8.2
và 4.9.1
sử dụng g++ test.cpp --std=c++11
, biên soạn thành công. Khi biên soạn với clang 3.4
và 3.5
sử dụng clang++ test.cpp --std=c++11
Tuy nhiên, việc biên soạn thất bại:constexpr std :: mảng với static_assert
test.cpp:8:16: error: static_assert expression is not an integral constant expression
static_assert(arr[0] == arr2[0], "asdf");
^~~~~~~~~~~~~~~~~
test.cpp:8:16: note: non-constexpr function 'operator[]' cannot be used in a constant expression
Vì vậy, câu hỏi của tôi là, mà trình biên dịch là "đúng" theo nghĩa là phù hợp với C++ 11? Và, nếu clang
là chính xác, thì tại sao std :: mảng operator[]
không có khả năng constexpr? Đó không phải là một trong những điều mà std::array
được cho là sẽ giúp giải quyết?
Trong C++ 11, có thể khai báo 'array :: operator [] const' thành' constexpr', nhưng ủy ban không nhận được xung quanh để làm như vậy cho đến khi C++ 14. Trong C++ 14, nó có thể khai báo 'array :: operator []' như 'constexpr' ... – Casey
@Casey Tôi tìm thấy tài liệu đã giới thiệu sự thay đổi thành' N3485', tôi đã thêm nó vào câu trả lời của mình. Theo như tôi hiểu nếu nó được coi là một khiếm khuyết nó nên được cho phép trong chế độ C++ 11 nhưng nếu không thì không. Các tài liệu không làm rõ rằng mặc dù. –
Tôi chủ yếu nói đùa ở tiêu chuẩn: thay đổi thư viện thường tụt hậu so với cốt lõi, bởi vì lõi thích thay đổi vào phút cuối mà không cho thư viện đủ thời gian để phản ứng. Tôi tin rằng bổ sung 'constexpr' trong N3470 là một sự nâng cao, vì báo cáo lỗi duy nhất cho' mảng' liên quan đến 'constexpr' là [LWG DR 720] (http://www.open-std.org/jtc1/sc22 /wg21/docs/lwg-defects.html#720) và không liên quan đến 'toán tử []'. – Casey