Điều này không được phép bởi cả văn bản của tiêu chuẩn và một số triển khai chính như đã nêu trong các ý kiến, nhưng vì những lý do hoàn toàn không liên quan.
Đầu tiên, lý do "theo sách": điểm khởi tạo A<C>là, theo tiêu chuẩn, ngay trước định nghĩaB và điểm khởi tạo std::is_default_constructible<C>là ngay trước đó:
Đối với chuyên môn hóa mẫu lớp, [...] nếu chuyên môn hóa được khởi tạo hoàn toàn bởi vì nó được tham chiếu từ bên trong một chuyên môn mẫu khác, nếu bối cảnh mà chuyên môn hóa được tham chiếu phụ thuộc vào một tham số mẫu và nếu việc chuyên môn hóa không được khởi tạo trước đó đến phần khởi tạo của mẫu kèm theo, điểm khởi tạo ngay trước điểm khởi tạo của mẫu kèm theo. Mặt khác, điểm khởi tạo cho một chuyên môn như vậy ngay lập tức đi trước khai báo hoặc định nghĩa phạm vi không gian tên đề cập đến chuyên môn hóa.
Vì Crõ ràng là không đầy đủ tại thời điểm đó, hành vi khởi tạo std::is_default_constructible<C>không được xác định. Tuy nhiên, xem vấn đề cốt lõi 287 , sẽ thay đổi quy tắc này.
Trong thực tế, điều này có liên quan đến NSDMI.
- Các NSDMI rất kỳ lạ vì chúng bị phân tích cú pháp bị trì hoãn - hoặc theo cách nói chuẩn, chúng là một "bối cảnh hoàn chỉnh của lớp".
- Do đó,
= 0về nguyên tắc , điều đó có thể đề cập đến những điều Bchưa được khai báo, vì vậy việc triển khai thực sự không thể cố gắng phân tích nó cho đến khi nó kết thúc B.
- Việc hoàn thành một lớp đòi hỏi phải khai báo ngầm định các hàm thành viên đặc biệt, đặc biệt là hàm tạo mặc định, vì
Ckhông có hàm tạo được khai báo.
- Các phần của tuyên bố đó (constexpr-ness, noexcept-ness) phụ thuộc vào các thuộc tính của NSDMI.
- Do đó, nếu trình biên dịch không thể phân tích cú pháp NSDMI, nó không thể hoàn thành lớp.
- Kết quả là, tại thời điểm nó bắt đầu
A<C>, nó nghĩ rằng nó Ckhông đầy đủ.
Toàn bộ khu vực này liên quan đến các khu vực bị phân tích cú pháp chậm được xác định rõ ràng, với sự phân kỳ thực hiện đi kèm. Nó có thể mất một lúc trước khi nó được làm sạch.