【问题标题】:GCC 7 C++ 17 support for folding expressionsGCC 7 C++ 17 对折叠表达式的支持
【发布时间】:2020-02-21 05:58:41
【问题描述】:

以下 sn-p 将在 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 错误?

【问题讨论】:

  • FWIW 你应该可以使用数组技巧:int discard[] = {([thing = things](){}(), 0)...};
  • @NathanOliver 但是由于相同的 GCC 错误,这给出了相同的错误?
  • @uneven_mark 哦。我认为问题在于折叠表达式本身,而不是 lambda 捕获破坏了表达式。现在我已经实际阅读了这个错误,我发现它确实不起作用。

标签: c++ gcc c++17 gcc7


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2020-01-25
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多