Dar*_*ioP 6 c++ lambda templates non-type c++20
下面的代码合法吗?
template <auto Lambda>
struct A {};
int main () {
auto lmb = [](int i){return i*i;};
A<lmb> a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我注意到 g++ 编译得很好,而 clang++ 返回
error: a non-type template parameter cannot have type '(lambda at main.cpp:...)'.
lambda 可以用作非类型模板参数吗?
是的,使用已实现P0732R2 - 非类型模板参数中的类类型但clang++尚未实现的实现。
来源: https: //en.cppreference.com/w/cpp/compiler_support
请注意,lambda 至少需要是constexpr(默认情况下):
当此说明符不存在时,函数调用运算符
constexpr无论如何都会存在,如果它恰好满足所有constexpr函数要求。
但是,您可以添加constexpr以在 lambda 本身上获取错误,而不是将其用作模板参数。附带说明:您还可以将其指定为,以使其consteval用作非类型模板参数。
有状态 lambda 可以是constexpr:
constexpr auto lmb1 = [](int i) {
static int x = 0;
return i*i + ++x;
};
Run Code Online (Sandbox Code Playgroud)
而 lambda 通过引用捕获或通过复制和变异 ( mutable) 捕获则不能。不过,通过复制 a 来捕获constexpr是可以的。
通用 lambdaconstexpr也可能是:
constexpr auto gen_lmb = []<typename T>(T& val) {
val += val;
return val;
};
template <auto Lambda>
struct A {
template<typename T>
void doit(T&& arg) {
std::cout << Lambda(arg) << '\n';
}
};
//...
A<gen_lmb> ginst;
int v = 1000;
ginst.doit(v);
ginst.doit(std::string("foo "));
std::cout << v << '\n';
Run Code Online (Sandbox Code Playgroud)
2000
foo foo
2000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |