moim skromnym zdaniem i na podstawie Concepts TS§5.1.4/C4 Wymaga wyrażenia [expr.prim.req] (podkr):
wymaga ekspresja powinna pojawić się jedynie w ramach koncepcji defin (7.1.7) lub w klauzuli wymagającej deklaracji wzoru (klauzula 14) lub deklaracji funkcji (8.3.5).
Powyższy cytat specjalnie dyktuje konteksty gdzie mogą pojawić się requires
klauzula i lambda nie jest jednym z nich.
Concequently,
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
jest nieprawidłowy.
Jednak w §5.1.2 wyrażeń lambda [expr.prim.lambda] jest następujący przykład:
template<typename T> concept bool C = true;
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda
Więc sądzę, można osiągnąć to, co chcesz w następujący sposób:
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
Dlaczego nie można po prostu napisać normalnego funktor? – inf
The Concepts TS nie modyfikuje gramatyki lambd, więc myślę, że nie jest możliwe dodanie klauzuli require do lambda. Zmieniając definicję * specyfikatora typu prostego *, można użyć specyfikatorów typu ograniczonego jako parametrów. – dyp