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

Vit*_*meo 14 c++ lambda language-lawyer variadic-templates c++17

请考虑以下代码段:

template <int... Is>
void foo()
{
    ([i = Is]{}(), ...); 
}
Run Code Online (Sandbox Code Playgroud)
  • clang++ (trunk)成功编译代码 -std=c++17

  • g++ (trunk)无法编译,并出现以下错误:

    <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]{}(), ...);
        ~~~~~~~~~~^~
    
    Run Code Online (Sandbox Code Playgroud)

    在godbolt.org上

这是一个g++错误,还是标准阻止扩展参数包作为lambda介绍者的一部分

Sto*_*ica 9

这有一个关于它的错误的外观.

[temp.variadic/4

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

  • ... [不相关]
  • 在fold-expression中; 模式是包含未扩展参数包的强制转换表达式.

一个完整的lambda表达式(就像你有的那样)带有函数调用,如果跟随语法产生,则是一个有效的强制转换表达式.没有理由阻止它成为有效的模式.