【问题标题】:Explicit instantiation of templated lambda [duplicate]模板化 lambda 的显式实例化
【发布时间】:2021-05-02 02:25:30
【问题描述】:

我刚刚遇到了一个显式实例化模板化 lambda 的问题。下面的代码无法编译,但我不知道在这种情况下出了什么问题:

        [&]<auto... II>(std::index_sequence<II...>) {
            auto check = [&]<auto I>(){
            };
            (check<II>(),...);
        }(std::make_index_sequence<N>{});

编译器错误(gcc 主干: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>{});

还有其他表达方式吗?

【问题讨论】:

  • 您需要为operator()指定模板值,而不是调用(check&lt;II&gt;(),...);(check. template operator()&lt;II&gt;(),...);
  • 这不是显式的实例化,而是显式的模板参数。

标签: c++ templates lambda c++20


【解决方案1】:

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

template<auto I> void operator()();

成员函数是模板。

错误是由于尝试向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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2021-11-25
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多