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

时间:2018-04-08 21:31:05

标签: c++ lambda language-lawyer variadic-templates c++17

请考虑以下代码段:

template <int... Is>
void foo()
{
    ([i = Is]{}(), ...); 
}
  • clang++(主干)使用-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]{}(), ...);
        ~~~~~~~~~~^~
    

    on godbolt.org

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

1 个答案:

答案 0 :(得分:9)

这看起来有一个关于它的错误。

  

[temp.variadic]/4

     

包扩展由模式和省略号组成   其实例化产生零个或多个实例化   列表中的模式(如下所述)。模式的形式取决于   在扩张发生的背景下。包装扩展可以   发生在以下情况中:

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

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