Trong thiển ý của tôi và dựa trên Concepts TS§5.1.4/c4 Yêu cầu biểu thức [expr.prim.req] (Mine Nhấn mạnh):
một đòi hỏi thể hiện trách nhiệm chỉ xuất hiện trong vòng một khái niệm defin ition (7.1.7), hoặc trong điều khoản yêu cầu của một tờ khai mẫu (Điều 14) hoặc khai báo hàm (8.3.5).
Trích dẫn trên chỉ rõ các ngữ cảnh trong đó mệnh đề requires
có thể xuất hiện và lambdas không phải là một trong số chúng.
Concequently,
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
là không hợp lệ.
Tuy nhiên, trong §5.1.2 biểu thức Lambda [expr.prim.lambda] có ví dụ sau:
template<typename T> concept bool C = true;
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda
Vì vậy, tôi đoán, bạn có thể thực hiện những gì bạn muốn theo cách sau đây:
template <class T> concept bool C1 = true;
template <class T> concept bool C2 = true;
template <class T> concept bool C3 = C1<T> && C2<T>; // Define a concept that combines
// `C1` and `C2` requirements.
int main() {
auto f = [](C3 x) { /* Do what ever */ }; // OK generic lambda that requires input
// argument satisfy `C1` and `C2`
}
Live Demo
Tại sao bạn không chỉ cần viết một functor bình thường không? – inf
Các khái niệm TS không sửa đổi ngữ pháp cho lambdas, vì vậy tôi nghĩ rằng không thể thêm mệnh đề yêu cầu vào một lambda. Bằng cách thay đổi định nghĩa của * simple-type-specifier *, nó cho phép sử dụng các kiểu-specifier-constrained như các tham số. – dyp