请考虑以下代码段:
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]{}(), ...);
~~~~~~~~~~^~
这是一个g++
错误,还是标准阻止扩展参数包作为 lambda-introducer 的一部分?
答案 0 :(得分:9)
这看起来有一个关于它的错误。
包扩展由模式和省略号组成 其实例化产生零个或多个实例化 列表中的模式(如下所述)。模式的形式取决于 在扩张发生的背景下。包装扩展可以 发生在以下情况中:
- ... [不相关]
- 在折叠表达中;模式是包含未扩展参数包的强制转换表达式。
一个带有函数调用的完整lambda表达式(就像你一样),如果跟随语法产生,则是一个有效的cast-expression。没有理由阻止它成为有效的模式。