「これ」がラムダによってキャプチャされた場合、明示的に使用する必要がありますか?


27

thisラムダでのキャプチャが明示的に使用することがわかった例。例えば:

capturecomplete = [this](){this->calstage1done();};

しかし、それを暗黙的に使用することも可能であるようです。例えば:

capturecomplete = [this](){calstage1done();};

これをg ++でテストし、コンパイルしました。

これは標準のC ++ですか?(もしそうなら、どのバージョンか)、またはそれは何らかの拡張形式ですか?


1
答えは正しいですが、this->明示的に使用する理由として考えられるのは、明示的に取得した値が明示的に使用されるようにするためです。キャプチャされない[](){ calstage1done(); }ため、合法ではないことに注意してくださいthis。しかし、this明示的にキャプチャする場合、キャプチャされた値を実際に使用しないのに関数本体が一目で見えるのは驚くべきことです[this](){ calstage1done(); }
カイルストランド

私はこれをある程度見ることができますが、同時に、単純なタスクであるべきものについては恐ろしく冗長に思えます。
プラグウォッシュ

1
MSVC(多分2015年のみ)でもthis、ラムダでのキャプチャと使用に問題があり、MSVCを明示的に使用する理由にもなります
Flamefire

@plugwash:開発者は常に怠惰であり、物事を最小限に抑えようとする傾向があり、言語デザイナーも例外ではありません。ただし、あいまいさを解決するために冗長性が必要になることがよくありますが、ここではそうです。
14:43

回答:


25

これは標準であり、ラムダが追加されたC ++ 11以降、このようになっています。cppreference.comによると:

名前の検索、thisポインターのタイプと値の決定、および 非静的クラスメンバーへのアクセスのために、クロージャタイプの関数呼び出し演算子の本体がラムダ式のコンテキストで考慮されます。

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.