2

[&]関数内にラムダがあり、ラムダ内でローカル静的変数をキャプチャして使用しています。そもそもこれが有効かどうかはわかりませんが、これは正常にコンパイルおよびリンクされます。

void Foo()
{
    static int i = 5;

    auto bar = [&]()
    {
        i++;
    };

    bar();
}

int main()
{
    Foo();
}

しかしFoo、テンプレート化された関数を作成することによって:

template <typename T>
void Foo()
{
    static int i = 5;

    auto bar = [&]()
    {
        i++;
    };

    bar();
}

int main()
{
    Foo<int>();
}

次のエラーが発生します。

g ++-4.7 -std = c ++ 11 main.cpp
/tmp/cctjnzIT.o:関数内'void Foo():: {lambda()#1} :: operator()()const':
main.cpp: (.text + 0x1a):「i」への未定義の参照
main.cpp:(。text + 0x23):「i」への未定義の参照
collect2:エラー:ldが1つの終了ステータスを返しました

だから、私は2つの質問があります:

  1. 最初の例で使用iしているのは有効なC++でもありますか?
  2. #1の場合、2番目の例の何が問題になっていますか?それともこれはgccのバグですか?
4

2 に答える 2

4

1)はい、ラムダ関数で常にアクセスできる&ため、定義から削除することもできます。static2)バグです: http: //gcc.gnu.org/bugzilla/show_bug.cgi?id = 54276

于 2013-03-01T18:16:27.550 に答える
-2

1)はい、「i」の値を呼び出し間で持続させることを意図していると仮定します。

2)コンパイラのバグではありません。静的インスタンス変数もテンプレートを介して定義する必要があります。この投稿を参照してください。

于 2013-03-01T18:18:01.983 に答える