Cách đây không lâu, các biểu thức yêu cầu (cụm từ được giới thiệu bởi yêu cầu thứ hai) không được phép trong các biểu thức ràng buộc (cụm từ được giới thiệu bởi yêu cầu đầu tiên). Nó chỉ có thể xuất hiện trong các định nghĩa khái niệm. Trên thực tế, đây chính xác là những gì được đề xuất trong phần của bài báo đó, nơi yêu cầu đó xuất hiện.
Tuy nhiên, vào năm 2016, đã có một đề xuất để giảm bớt hạn chế đó [Ghi chú của biên tập viên: P0266 ]. Lưu ý gạch ngang của đoạn 4 trong phần 4 của bài báo. Và do đó sinh ra đòi hỏi phải có.
Nói thật, tôi chưa bao giờ thực sự thực hiện hạn chế đó trong GCC, vì vậy nó luôn luôn có thể. Tôi nghĩ rằng Walter có thể đã phát hiện ra điều đó và thấy nó hữu ích, dẫn đến bài báo đó.
Bất cứ ai nghĩ rằng tôi không nhạy cảm với việc viết lách đòi hỏi hai lần, tôi đã dành một chút thời gian để xác định xem điều đó có thể được đơn giản hóa hay không. Câu trả lời ngắn gọn: không.
Vấn đề là có hai cấu trúc ngữ pháp cần được giới thiệu sau một danh sách tham số mẫu: rất phổ biến là một biểu thức ràng buộc (như P && Q
) và đôi khi yêu cầu cú pháp (như requires (T a) { ... }
). Đó gọi là biểu thức yêu cầu.
Việc đầu tiên yêu cầu giới thiệu các ràng buộc. Thứ hai yêu cầu giới thiệu biểu thức yêu cầu. Đó chỉ là cách ngữ pháp sáng tác. Tôi không thấy khó hiểu chút nào.
Tôi đã cố gắng, tại một thời điểm, để thu gọn những thứ này thành một yêu cầu duy nhất. Thật không may, điều đó dẫn đến một số vấn đề phân tích cú pháp khó khăn nghiêm trọng. Bạn không thể dễ dàng biết được, ví dụ nếu a (
sau yêu cầu biểu thị một biểu thức con lồng nhau hoặc danh sách tham số. Tôi không tin rằng có một sự phân định hoàn hảo các cú pháp đó (xem phần cơ sở cho cú pháp khởi tạo thống nhất; vấn đề này cũng có).
Vì vậy, bạn đưa ra lựa chọn: thực hiện yêu cầu giới thiệu một biểu thức (như hiện tại) hoặc làm cho nó giới thiệu một danh sách các yêu cầu được tham số hóa.
Tôi đã chọn cách tiếp cận hiện tại bởi vì hầu hết thời gian (như trong gần 100% thời gian), tôi muốn một cái gì đó ngoài một biểu thức yêu cầu. Và trong trường hợp cực kỳ hiếm hoi tôi đã muốn có một biểu thức đòi hỏi cho các ràng buộc ad hoc, tôi thực sự không ngại viết từ đó hai lần. Đó là một chỉ báo rõ ràng rằng tôi đã không phát triển một sự trừu tượng âm thanh đủ cho mẫu. (Bởi vì nếu tôi có, nó sẽ có một cái tên.)
Tôi có thể đã chọn để làm cho các yêu cầu giới thiệu một biểu thức yêu cầu. Điều đó thực sự tồi tệ hơn, vì thực tế tất cả các ràng buộc của bạn sẽ bắt đầu giống như thế này:
template<typename T>
requires { requires Eq<T>; }
void f(T a, T b);
Ở đây, yêu cầu thứ 2 được gọi là yêu cầu lồng nhau; nó đánh giá biểu thức của nó (mã khác trong khối biểu thức yêu cầu không được ước tính). Tôi nghĩ rằng đây là cách tồi tệ hơn hiện trạng. Bây giờ, bạn có thể viết yêu cầu hai lần ở khắp mọi nơi.
Tôi cũng có thể đã sử dụng nhiều từ khóa hơn. Đây là một vấn đề theo đúng nghĩa của nó --- và nó không chỉ là đổ xe đạp. Có thể có một cách để "phân phối lại" các từ khóa để tránh trùng lặp, nhưng tôi đã không suy nghĩ nghiêm túc. Nhưng điều đó không thực sự thay đổi bản chất của vấn đề.
noexcept(noexcept(...))
.