Biểu thức lambda không được phép trong ngữ cảnh không được đánh giá (ví dụ: trong decltype) và không thể là biểu thức liên tục cho đến gần đây. Do đó không có cách nào để sử dụng chúng trong các đối số mẫu.Đã đánh giá lambex constexpr trong đối số mẫu không loại
Trong C++ 17, tuy nhiên, hàm lambdas biểu thức liên tục sẽ là có thể. Điều này vẫn không cho phép sử dụng chúng trong các đối số mẫu nói chung.
Tuy nhiên đặc biệt cho phi kiểu mẫu đối số không đổi biểu thức biểu thức lambda có thể được sử dụng trong một bối cảnh được đánh giá, ví dụ:
template<int N> struct S { constexpr static int value = N; };
int main() {
int N = S<[]()constexpr{return 42;}()>::value;
}
Đó vẫn không hoạt động mặc dù, bởi vì biểu thức lambda là không được phép một cách rõ ràng trong mẫu đối số cho dù loại hoặc không nhập.
Câu hỏi của tôi là lý do đằng sau việc không cho phép cấu trúc ở trên. Tôi có thể hiểu rằng các kiểu lambdas trong chữ ký chức năng có thể có vấn đề, nhưng ở đây kiểu đóng của chính nó là không liên quan, chỉ có giá trị trả về (hằng số biên dịch) được sử dụng.
Tôi nghi ngờ rằng tất cả các câu lệnh trong phần lambda sẽ trở thành một phần của biểu thức đối số mẫu và do đó SFINAE sẽ cần phải được áp dụng nếu bất kỳ câu lệnh nào trong cơ thể bị hình thành không đúng lúc thay thế. Có lẽ đó sẽ yêu cầu công việc đáng kể từ các nhà phát triển trình biên dịch.
Nhưng đó thực sự là động lực của tôi. Nếu có thể sử dụng cấu trúc ở trên thì SFINAE có thể được sử dụng không chỉ với các biểu thức liên tục, mà còn các câu lệnh khác hợp lệ trong các hàm constexpr (ví dụ: khai báo kiểu chữ).
Bên cạnh tác động đối với người viết trình biên dịch, có bất kỳ vấn đề nào mà điều này có thể gây ra hay không, ví dụ: sự mơ hồ, mâu thuẫn hoặc biến chứng trong tiêu chuẩn?
Tôi nghĩ rằng bạn đã trả lời câu hỏi của riêng bạn. – Barry
Vâng, +1 @Barry và đây thực sự là một câu hỏi thú vị. – skypjack
@Barry Tôi đã sửa đổi một chút câu hỏi của mình. Tôi hy vọng cho một số xác nhận rằng đây thực sự là lý do chính (duy nhất), có thể một số tham chiếu đến một bài báo/thảo luận của ủy ban đề cập đến lý do. – user4407569