GCC导致lambda捕获的参数包的段错误

时间:2017-01-20 18:07:58

标签: c++ gcc lambda

我有以下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下失败并出现分段错误。

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

那么这里出了什么问题?

P.S: 这不仅限于-O3-O0不会出现段错误,但不会返回预期结果(“Hello World!”):

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

[:~/tmp] $
P.P.S:进一步降低了SSCCE。现在我甚至不再使用-Wall -Wextra进行诊断。

1 个答案:

答案 0 :(得分:9)

我强烈怀疑 g ++ bug

以下是一些注释:

  

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

     

...

     

请   提交完整的错误报告,如果适用,请提供预处理的来源。

     

请包含完整的回溯以及任何错误报告。看到   http://gcc.gnu.org/bugs.html获取指示。