Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;11嵌套lambda编译错误_C++_C++11_Lambda_G++_Segmentation Fault - Fatal编程技术网

C++ c++;11嵌套lambda编译错误

C++ c++;11嵌套lambda编译错误,c++,c++11,lambda,g++,segmentation-fault,C++,C++11,Lambda,G++,Segmentation Fault,我错过了什么?下面的代码使用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 &l

我错过了什么?下面的代码使用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;
}
如果我取消注释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.

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

粗略地说,你可以把g++4.7看作是一个具有高质量实现的晚测试版(尽管g++4.7.2也是如此),而对于许多C++11特性来说,g++4.6更像是阿尔法/早期测试版。您碰巧遇到了一个g++4.6错误。跟踪这个特定的bug没有多大意义,您可能会在bug数据库中发现类似的错误,也可能不会。在任何情况下,升级到最新的稳定版本都是推荐的方法


当前的开发正朝着支持C++14(g++4.9和Clang3.4)的方向发展,而lambdas是正在开发的主要功能之一(支持自动参数和移动捕获)。这些特性现在都是实验性的,你也可以预料到一些bug。买主注意(但一定要做实验!)。

这不是你的错,而是编译器的问题。它使用g++4.7.2运行。您不需要捕获
cout
?在msvc 11中运行良好:-P@JohnDibling:不,
cout
不是一个局部变量,而是一个“全局”(在名称空间
std
)对象,lambdas不需要捕获全局对象。他不是推它们,而是轻轻地触摸它们,在他的样本中……啊哈。。。当其他人解释这个问题时,这个答案似乎是如此明显和简单。@user2583880很高兴能提供帮助+1我只是希望可怜的OP不要期望正则表达式在g++中实际工作:P@NoSenseEtAl正则表达式是一种库功能,而不是语言功能。在大多数情况下,Boost.Regex可以替代。
$ 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++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3