gpt4 book ai didi

C++11 嵌套 lambda 编译段错误

转载 作者:行者123 更新时间:2023-11-30 04:16:36 25 4
gpt4 key购买 nike

我错过了什么?以下代码使用 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 发行版或第 3 方包服务器的二进制包安装。

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

当前的开发正朝着 C++14 支持(g++ 4.9 和 Clang 3.4)的方向发展,而 lambda 是正在开发的主要功能之一(以支持自动参数和移动捕获)。这些功能现在还处于试验阶段,您可能还会遇到一些错误。买者自负(但一定要实验!)。

关于C++11 嵌套 lambda 编译段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com