在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang



请考虑以下代码片段:

template <int... Is>
void foo()
{
    ([i = Is]{}(), ...); 
}
  • clang++(主干(使用 -std=c++17 成功编译代码

  • g++(中继(编译失败,并显示以下错误:

    <source>: In function 'void foo()':
    <source>:4:11: error: parameter packs not expanded with '...':
        ([i = Is]{}(), ...);
            ^~
    <source>:4:11: note:         'Is'
    <source>:4:16: error: operand of fold expression has no unexpanded parameter packs
        ([i = Is]{}(), ...);
        ~~~~~~~~~~^~
    

    在 godbolt.org

这是一个g++错误,还是标准阻止将参数包扩展为 lambda 引入器的一部分?

这看起来像一个错误。

[温度变化]/4

包扩展由图案和省略号组成, 实例化产生零个或多个实例化 列表中的模式(如下所述(。模式的形式取决于 在发生扩展的上下文中。包扩展可以 在以下上下文中发生:

  • 。[不相关]
  • 在折叠表达式中;模式是包含未展开参数包的强制转换表达式。

一个完整的 lambda 表达式(就像你一样(和一个函数调用,如果遵循语法产品,则是一个有效的强制转换表达式。没有理由阻止它成为有效的模式。

最新更新