2

以下のように単純なラムダを作成しましたが、期待どおりに動作します (GCC 4.6.4 および 4.7.2 -- demo )。しかし、その後、標準を確認したところ、5.1.2-8では、ラムダ キャプチャでの=andの使用が明示的に禁止されています。this

... lambda-capture に= であるcapture-defaultが含まれる場合、 lambda-captureにはこれが含まれず、含まれる各識別子の前に & が付きます。...

私は何か間違ったことを読んでいますか?これは実際に許可されていますか? いいえの場合、許可されていない理由がわかりません。また、GCCがそれを許可するのは間違っているということですか?

#include <iostream>
#include <functional>

using namespace std;

struct sample {
    int a;

    std::function<int()> get_simple(int o) {
        return [=,this]() {
            return a + o;
        };
    }
};

int main() {
    sample s;
    auto f = s.get_simple(5);
    s.a = 10;
    cout << f() << endl; //prints 15 as expected
}
4

3 に答える 3

3

コードを GCC 4.8.1でコンパイルし、フラグを使用すると-Wall、コンパイルで次の警告が表示されます。

main.cpp: メンバー関数 'std::function sample::get_simple(int)' 内:

main.cpp:10:19:警告: 「this」の明示的なコピーによるキャプチャは、コピーによるキャプチャのデフォルトで冗長です[デフォルトで有効]

     return [=,this]() {
               ^

これは、C++11 より前の標準ラムダと互換性を持たせるために GCC によって作成されたものだと思います。

于 2013-07-26T03:12:25.483 に答える