当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《GCC导致lambda捕获的参数包的段错误》经验,为你挑选了1个好方法。

我有以下SSCCE:

#include 
#include 

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

template 
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...]().但是,到目前为止,我认为这[&]与逐个列出所有参数一样.

那么这里出了什么问题?

PS:这不仅限于此-O3.-O0不会发生段错误但不会返回预期的结果("Hello World!"):

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

[:~/tmp] $

PPS:进一步降低SSCCE.现在我甚至都没有得到诊断-Wall -Wextra了.



1> AMA..:

我强烈怀疑是一个g ++错误.


以下是一些注意事项:

替换std::string为任何基本类型,例如,int 仍然不起作用

clang和VC++将按预期工作

不通过引用传递参数包导致g ++ 7.0.1内部编译器错误,输出如下:

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

...

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

请包含完整的回溯以及任何错误报告.有关说明,请参阅 http://gcc.gnu.org/bugs.html.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有