【问题标题】:c++11 nested lambda compile segfaultc++11嵌套lambda编译段错误
【发布时间】:2013-07-13 11:47:42
【问题描述】:

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

【问题讨论】:

  • 这不是你的错,而是编译器的问题。它与 g++ 4.7.2 ideone.com/SRSYJJ 一起运行
  • 你不需要捕获cout吗?
  • 在 msvc 11 中运行良好:-P
  • @John Dibling:不,cout 不是局部变量,而是“全局”(在命名空间 std 中)对象,并且 lambdas 不需要捕获全局对象。
  • 他不是在推动它们,而是在他的样本中轻轻地触摸它们..

标签: c++ c++11 lambda g++ segmentation-fault


【解决方案1】:

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

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

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

【讨论】:

  • 啊哈! ...当其他人解释它时,这个答案似乎如此明显和简单。
  • @user2583880 很高兴能为您提供帮助!
  • +1 我只是希望糟糕的 OP 不会期望正则表达式在 g++ 中实际工作:P
  • @NoSenseEtAl 正则表达式是库功能,而不是语言功能。对于大多数用途,Boost.Regex 可以替代。
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
相关资源
最近更新 更多