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 で // でコメントアウトされている 3 行のコメントを外すと、コンパイラは次のように segfaults します

$ 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 は高品質の実装を備えた後期ベータ版と見なすことができます (ただし、g++ 4.7.2 は微妙なラムダ バグです)。一方、g++ 4.6 はアルファ/初期ベータの品質です。多くの C++11 機能用。たまたま g++ 4.6 のバグに遭遇しました。この特定のバグを追跡しても意味がありません。バグ データベースで同様の障害が見つかる場合と見つからない場合があります。いずれにせよ、最新の安定版リリースにアップグレードすることをお勧めします。

現在の開発は C++14 サポート (g++ 4.9 および Clang 3.4) に向けて進んでおり、ラムダは開発中の主な機能の 1 つです (自動引数と移動キャプチャをサポートするため)。これらの機能は現在非常に実験的なものであり、いくつかのバグも予想されます。emptor に注意してください (ただし、必ず実験してください!)。

于 2013-07-15T20:55:44.357 に答える