【问题标题】:GCC causes segfault for lambda-captured parameter packGCC 导致 lambda 捕获的参数包的段错误
【发布时间】:2017-12-20 10:12:55
【问题描述】:

我有以下 SSCCE:

#include <iostream>
#include <string>

void foo(const std::string &a) {
  std::cout << a << std::endl;
}

template <typename... Args>
void bar(Args &&... args) {
  [&]() {
    [&]() {
          foo(args...);
      }();
  }();
}

int main() {
 const std::string x("Hello World!");
 bar(x);
}

在 clang++ (3.9.1) 下编译并发出“Hello World”。 Gcc 6.3 因-O3 下的分段错误而失败。

我可以通过引用显式传递指针和包来解决问题,将[&amp;]() 替换为[&amp;args...]()。但是,到目前为止,我认为[&amp;] 的作用与将所有参数一一列出一样。

那么这里出了什么问题?

附注: 这不仅限于-O3-O0 没有段错误但没有返回预期的结果(“Hello World!”):

[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out

[:~/tmp] $

P.P.S:进一步降低 SSCCE。现在我什至没有得到-Wall -Wextra 的诊断信息。

【问题讨论】:

  • 似乎只发生在优化中。
  • 无法确认 - 我也遇到了 -O0(见附录)
  • @Exagon,当然可以通过引用传递。但是,它不能被复制。这是一个示例:melpon.org/wandbox/permlink/lj4SQhth5iis81FG
  • @mrks 糟糕,我注意到缺少段错误,但忘记了它应该产生输出。
  • 更新示例,与unique_ptr无关。

标签: c++ gcc lambda


【解决方案1】:

我强烈怀疑存在 g++ 错误


以下是一些注意事项:

内部编译器错误:在 make_decl_rtl 中,位于 varasm.c:1304

...

请 提交完整的错误报告,并在适当的情况下提供经过预处理的源代码。

请在任何错误报告中包含完整的回溯。看 http://gcc.gnu.org/bugs.html 获取说明。

【讨论】:

猜你喜欢
  • 2016-10-19
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2013-09-16
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多