【问题标题】:Expanding parameter pack as part of lambda capture in fold expression - gcc vs clang [duplicate]在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc vs clang [重复]
【发布时间】:2018-04-08 21:31:05
【问题描述】:

考虑以下代码sn-p:

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 的一部分?

【问题讨论】:

  • 仅供参考,GCC 在复杂的包扩展方面存在一些问题。 this
  • 这是47226
  • @Barry:我完成了。在发布问题之前,我会为其添加书签并记下将其打开
  • @Barry: 等等 - 它说它已被修复......但它仍然发生在主干上

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


【解决方案1】:

这看起来像是一个错误。

[temp.variadic]/4

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

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

带有函数调用的完整 lambda 表达式(如您所见)是有效的 cast-expression 如果遵循语法产生式。没有理由将其排除在有效模式之外。

【讨论】:

  • 很好,你介意链接到 cast-expression 的段落吗?
  • @PasserBy - 完全不介意。使“cast-expression”成为制作开始的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2020-01-15
  • 2013-03-23
  • 2020-11-07
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多