tôi đã cố gắng để chuyển tiếp-khai báo một constexpr
mẫu biến như thế này:Chuyển tiếp tuyên bố một mẫu biến constexpr
template<typename>
constexpr std::size_t iterator_category_value;
Mục đích là để ghi nhận rằng mỗi chuyên môn hóa nên constexpr
nhưng tôi phải thừa nhận rằng tôi không bao giờ kiểm tra xem nó là hợp pháp hay không và g ++ đã hài lòng với nó. Tuy nhiên, khi tôi đã cố gắng để biên dịch Spinnet này với kêu vang ++ thay vào đó, tôi nhận được lỗi sau:
error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long') constexpr std::size_t iterator_category_value; ^ = 0
Các lỗi có ý nghĩa, và loại bỏ constexpr
làm cho nó biến mất, do đó không phải là một vấn đề thực sự. Tuy nhiên, tôi tò mò bây giờ: không tiêu chuẩn cho phép như vậy tuyên bố constexpr
về phía trước cho một mẫu biến hoặc là nó bất hợp pháp? g ++ và clang ++ dường như không đồng ý và tôi muốn biết nơi tôi nên gửi báo cáo lỗi nếu cần.
Cả hai người trong số họ khiếu nại về biến số constepxr
chuyển tiếp không phải là mẫu biến, vì vậy ngữ cảnh mẫu biến có vẻ là điều khiến các trình biên dịch không đồng ý.
Nội dung của http://wg21.cmeerw.net/cwg/issue1712 ngụ ý rằng bạn không thể chuyển tiếp khai báo nó dưới dạng 'constexpr', tuy nhiên tôi không chắc chắn cách std cấm nó. Một mẫu biến không giống như một tuyên bố * đối tượng * với tôi. – dyp
OTOH, [dcl.dcl] p9 có vẻ rất chung chung và nên áp dụng cho các mẫu biến (=> các mẫu biến là các khai báo đối tượng => 'constexpr' yêu cầu khởi tạo) – dyp
@dyp Btw., Ý của bạn là" bây giờ "? Không phải bạn đang biên dịch các nguồn cập nhật nhất hiện có trên Git? – Columbo