1

我错过了什么?以下代码使用 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
4

1 回答 1

2

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

非常粗略且非官方地说,您可以将 g++ 4.7 视为具有高质量实现的后期 beta 版本(尽管 g++ 4.7.2 甚至是细微的 lambda 错误),而 g++ 4.6 更多的是 alpha / early beta 质量对于许多 C++11 功能。您碰巧遇到了 g++ 4.6 错误。跟踪这个特定的错误没有多大意义,您可能会也可能不会在错误数据库中找到类似的错误。无论如何,推荐的方法是升级到最新的稳定版本。

当前的开发面向 C++14 支持(g++ 4.9 和 Clang 3.4),而 lambda 是正在开发的主要功能之一(支持自动参数和移动捕获)。这些功能现在是非常实验性的,你也可以预料到那里会有一些错误。警告购买者(但一定要进行实验!)。

于 2013-07-15T20:55:44.357 回答