请考虑以下代码片段:
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 表达式(就像你一样(和一个函数调用,如果遵循语法产品,则是一个有效的强制转换表达式。没有理由阻止它成为有效的模式。