如何使用带有 lambda 仿函数参数的 requires 子句?
How to use a requires clause with lambda functor arguments?
有什么方法可以将通用 requires 子句应用于 lambda 仿函数的参数?
假设我有两个约束条件 C1
和 C2
需要根据参数进行检查。我希望以下内容能够工作,因为函数允许使用类似的语法:
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
但是这个 won't compile 与 GCC 6
以我拙见,基于 Concepts TS §5.1.4/c4 需要表达式 [expr.prim.req](强调我的):
A requires-expression shall appear only within a concept definition (7.1.7), or within the requires-clause of a template-declaration
(Clause 14) or function declaration (8.3.5).
以上引用具体说明了 requires
子句可以出现的上下文,而 lambda 不是其中之一。
因此,
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
无效。
但是,在 §5.1.2 Lambda 表达式 [expr.prim.lambda] 中有以下示例:
template<typename T> concept bool C = true;
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda
所以我想,您可以通过以下方式完成您想要的:
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`
}
有什么方法可以将通用 requires 子句应用于 lambda 仿函数的参数?
假设我有两个约束条件 C1
和 C2
需要根据参数进行检查。我希望以下内容能够工作,因为函数允许使用类似的语法:
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
但是这个 won't compile 与 GCC 6
以我拙见,基于 Concepts TS §5.1.4/c4 需要表达式 [expr.prim.req](强调我的):
A requires-expression shall appear only within a concept definition (7.1.7), or within the requires-clause of a template-declaration (Clause 14) or function declaration (8.3.5).
以上引用具体说明了 requires
子句可以出现的上下文,而 lambda 不是其中之一。
因此,
[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
// ...
}
无效。
但是,在 §5.1.2 Lambda 表达式 [expr.prim.lambda] 中有以下示例:
template<typename T> concept bool C = true;
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda
所以我想,您可以通过以下方式完成您想要的:
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`
}