GCC 7 C++ 17 支持折叠表达式

GCC 7 C++ 17 support for folding expressions

以下代码片段将在 GCC 8+ 中编译,但在 GCC 7 中无法编译。

template <typename... THINGS>
struct A
{
  explicit A(THINGS *... things)
  {
    (..., [thing = things](){}());
  }
};


int main()
{
    int thing;
    const auto thingy = A{&thing};
}

godbolt

声明的失败是参数包未展开:parameter packs not expanded with '...'
检查 GCC standards compliance page,GCC 7 应该支持折叠表达式。

除了std=c++17,我还需要其他标志吗? (我没看到)
标准还没有完全实施吗? (我没有看到任何迹象)
我可以解决这个问题吗,或者这只是我必须解决的 GCC 7 错误?

这是一个 GCC 错误。发现 tracked 问题,已在 8.2 中修复。

这是一个GCC bug,最初在版本 8.01 中报告,在版本 8.2 中修复。似乎当不使用折叠表达式时也会出现该错误(NathanOliver 提到的 C++11 时代 "expander trick" 也不起作用),因此您将不得不使用更长的解决方法不需要扩展 lambda 捕获中的模板参数包。例如:

template <typename THING>
void do_it(THING* thing) {
    [thing]{}();
}

explicit A(THINGS *... things)
{
    (..., do_it(things));
}