2

VS2010でコンパイルエラーが発生しましたが、コンパイラのバグと見なすべきかどうかわかりません。

シナリオを可能な限り単純化しました。テンプレートクラスはあるクラスのフレンドとして宣言され、ラムダ関数内でフレンドのプライベートメンバーにアクセスしようとします。コードは次のとおりです。

class Foo {
    template<typename T> friend class Bar;
    int priv;
};

template<typename T>
class Bar {
public:

    void func() {
        Foo foo;
        foo.priv = 17; // compiles
        auto lambda_func = [](Foo& _foo) { _foo.priv = 17;  }; // doesn't compile
    }
};

void test() {
    Bar<int> bar;
    bar.func();
}

これは、Barがテンプレートクラスである場合にのみ発生することに注意してください。

4

1 に答える 1

2

これはg++4.6および4.7で正常にコンパイルされます。それも合法だと思います---ラムダはそれが定義されている関数と同じくらい多くのアクセス権を持っているべきです。

C ++ 11標準、5.1.2p7によると(強調が追加されています):

ラムダ式の複合ステートメントは、関数呼び出し演算子の関数本体(8.4)を生成しますが、名前ルックアップ(3.4)の目的で、この(9.3.2)のタイプと値を決定し、次を参照するid式を変換します。非静的クラスメンバーを(* this)(9.3.1)を使用してクラスメンバーアクセス式に変換すると、複合ステートメントはラムダ式のコンテキストで考慮されます

これは、囲んでいるブロック内で有効なものはすべてラムダ本体で有効であることを意味すると読みました。

MSVC2010にはラムダに関する他のバグがあるため、このケースのコンパイルに失敗しても驚かない。

于 2012-04-15T08:32:41.883 に答える