我刚刚遇到显式实例化模板 lambda 的问题。下面的代码无法编译,但我无法弄清楚这种情况下出了什么问题:
[&]<auto... II>(std::index_sequence<II...>) {
auto check = [&]<auto I>(){
};
(check<II>(),...);
}(std::make_index_sequence<N>{});
编译器错误(gcc trunk:11.0.0):
rswitch.cc: In lambda function:
rswitch.cc:42:28: error: expected primary-expression before ')' token
42 | (check<II>(),...);
| ^
rswitch.cc:42:26: error: binary expression in operand of fold-expression
42 | (check<II>(),...);
我看起来必须像这样使用模板消歧:
[&]<auto... II>(std::index_sequence<II...>) {
auto check = [&]<auto I>(){
};
(this->template check<II>(),...);
}(std::make_index_sequence<N>{});
还有其他方式可以表达这一点吗?
check
本身不是模板。它是一个未指定闭包类型的对象,包含
template<auto I> void operator()();
The 成员函数是模板。
该错误是由于尝试向check
。这又不是模板本身。 lambda 函数调用运算符的模板参数需要可推导(即使它们已命名),函数调用语法才能正常工作。 C++20 并没有改变这一点。
显式指定参数的唯一方法是相当难看的
check.template operator()<II>()
但相反,使其可推导可能会更好。
[&]<auto... II>(std::index_sequence<II...>) {
auto check = [&]<auto I>(std::integral_constant<decltype(I), I>){
};
(check(std::integral_constant<decltype(II), II>{}),...);
}(std::make_index_sequence<N>{});
指定size_t
显式也是一个选项,而不是使用decltype(I)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)