繁体   English   中英

C ++ 11嵌套lambda编译segfault

[英]c++11 nested lambda compile segfault

我错过了什么? 以下代码使用g ++进行了预期的编译。

#include <functional>
#include <iostream>
#include <string>

using namespace std;
typedef std::function<void()> Foo;

/* This function does NOT make g++ segfault */
Foo factory() {
    return [] {cout << "Hi!" << endl;};
};

int main() {

    /* This nested lambda makes g++ segfault */
    // function<Foo()> factory = [] {
    //  return [] {cout << "Hello!" << endl;};
    // };

    factory()();
    return 0;
}

使用的编译标志:

g++ -c -Wall -std=c++0x NestedLambdaProblem.cpp 

如果我取消注释main中用//注释掉的三行,则编译器将出现如下段错误

$ g++ -c -Wall -std=c++0x NestedLambdaProblem.cpp 
g++: internal compiler error: Segmentation fault (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.6/README.Bugs> for instructions.

关于使用的g ++版本:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

如果要在生产环境中使用C ++ 11功能,请确保安装最新的稳定 g ++或Clang编译器。 目前,这将是g ++ 4.8.1和Clang 3.3。 既可以从源代码安装(有些技巧,但是如果您曾经编译过Linux内核,则应该进行管理),也可以从自己的Linux发行版或第三方软件包服务器安装二进制软件包。

非常粗略地(非官方地),您可以将g ++ 4.7视为具有高质量实现的后期beta版本(尽管即使g ++ 4.7.2都是细微的lambda bug ),而g ++ 4.6的alpha /早期beta质量更高适用于许多C ++ 11功能。 您碰巧遇到了g ++ 4.6错误。 跟踪该特定错误没有太大意义,您可能会或可能不会在错误数据库中找到类似的错误。 在任何情况下,建议升级到最新的稳定版本。

当前的开发正朝着C ++ 14支持(g ++ 4.9和Clang 3.4)发展,lambda是正在开发的主要功能之一(以支持自动参数和移动捕获)。 这些功能现在处于试验阶段,您还可以期待其中的一些错误。 警告购买者(但一定要试验!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM