4

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

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


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

神螺栓

声明的失败是参数包没有被扩展:parameter packs not expanded with '...'.
检查GCC 标准合规性页面,GCC 7 应该支持折叠表达式。

我还需要另外一面旗帜std=c++17吗?(我没有看到)
标准还没有完全实施吗?(我没有看到任何迹象)
我可以完成这项工作,或者这只是我将不得不解决的 GCC 7 错误?

4

2 回答 2

6

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

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

explicit A(THINGS *... things)
{
    (..., do_it(things));
}
于 2019-10-24T21:16:38.827 回答
4

这是一个 GCC 错误。找到跟踪的问题,在 8.2 中修复。

于 2019-10-24T21:13:22.057 回答