c++11嵌套lambda编译segfault

c++11 nested lambda compile segfault

本文关键字:segfault 编译 lambda 嵌套 c++11      更新时间:2023-10-16

我错过了什么?以下代码使用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视为一个具有高质量实现的后期测试版(尽管g++4.7.2是微妙的lambda错误),而g++4.6对于许多C++11功能来说更像是alpha/早期测试版。你碰巧遇到了一个g++4.6错误。追踪这个特定的错误没有多大意义,你可能会也可能不会在错误数据库中找到类似的错误。无论如何,建议升级到最新的稳定版本。

目前的开发正朝着支持C++14(g++4.9和Clang3.4)的方向发展,lambdas是正在开发的主要功能之一(支持自动参数和移动捕获)。这些功能现在是非常实验性的,你也可以期待一些bug。先发制人(但无论如何都要试验!)。