C++ 模板化lambda的显式实例化

C++ 模板化lambda的显式实例化,c++,templates,lambda,c++20,C++,Templates,Lambda,C++20,我刚刚遇到了一个显式实例化模板化lambda的问题。下面的代码无法编译,但我无法找出这种情况下的错误: [&]<auto... II>(std::index_sequence<II...>) { auto check = [&]<auto I>(){ }; (check<II>(),...); }(std::make_index_

我刚刚遇到了一个显式实例化模板化lambda的问题。下面的代码无法编译,但我无法找出这种情况下的错误:

        [&]<auto... II>(std::index_sequence<II...>) {
            auto check = [&]<auto I>(){
            };
            (check<II>(),...);
        }(std::make_index_sequence<N>{});
[&](std::index_序列){
自动检查=[&](){
};
(检查(),…);
}(std::make_index_sequence{});
编译器错误(gcc主干:11.0.0):

rswitch.cc:在lambda函数中:
rswitch.cc:42:28:错误:在“')标记之前应该有主表达式
42 |(check(),…);
|                            ^
rswitch.cc:42:26:错误:折叠表达式的操作数中存在二进制表达式
42 |(check(),…);
我似乎不得不使用模板消歧,如下所示:

        [&]<auto... II>(std::index_sequence<II...>) {
            auto check = [&]<auto I>(){
            };
            (this->template check<II>(),...);
        }(std::make_index_sequence<N>{});
[&](std::index_序列){
自动检查=[&](){
};
(此->模板检查(),…);
}(std::make_index_sequence{});

还有其他的表达方式吗?

检查
本身不是一个模板。它是一个未指定闭包类型的对象,包含

template<auto I> void operator()();
但相反,最好是让它可以推断

[&]<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>{});
[&](std::index_序列){
自动检查=[&](标准::积分常数){
};
(校验(std::积分_常数{}),…);
}(std::make_index_sequence{});
明确指定
size\u t
也是一个选项,而不是使用
decltype(I)

而不是调用
(check(),…)
,您需要为
操作符()指定模板值。
(check.template operator(),…)。这不是显式实例化,而是显式模板参数。
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>{});