2016-09-09 6 views
5

それをよりよく記述する方法がわからない。ここにコードがあります。これはgcc 4.9.2(Debian 8.5)のコンパイルに失敗します。以前のバージョンでコンパイルされたと思います。この問題は、ラムダ設定のデフォルト引数として後で宣言された構造体のメンバにアクセスする場合にのみ発生するようです。他のケースでも動作します。ラムダ設定の2ステップで宣言されたメンバーにアクセスする

// Test program 
class C1 
{ 
private: 
    // Forward-declared 
    struct S_Private; 
    S_Private* d_; 

public: 
    void func(); 
}; 

struct C1::S_Private 
{ 
    int a; 
}; 

void C1::func() 
{ 
    // This will work 
    int test = d_->a; 

    // Accessing the d_->a as a default argument in lambda setup 
    // will NOT work: 
    // error: invalid use of non-static data member ‘C1::d_’ 
    auto some_lambda = [&](int arg = d_->a) 
    { 
     // This will also work 
     int test2 = d_->a; 
    }; 
} 

int main(void) 
{ 
} 

答えて

4

は残念ながらauto some_lambda = [&](int arg = d_->a)で、d_->aは以前の機能で使用d_->aではありませんが、代わりにd_->aはあなたが[&]を使用してキャプチャthisに呼び出されています。これはメンバ変数なので、関数のデフォルト引数として使用することはできません。あなたはそれがクラスのメンバ、クラス自体ではないオブジェクトを使用して翻訳から見ることができるように

は基本的に

auto some_lambda = [&](int arg = d_->a) 
{ 
    // This will also work 
    int test2 = d_->a; 
}; 

struct some_unique_name 
{ 
    some_unique_name(C1*& var) : this_(var) {} 
    auto operator()(int arg = this_->d_->a) 
    { 
     // This will also work 
     int test2 = d_->a; 
    } 
    C1*& this_; 
}; 

auto some_lambda = some_unique_name{this}; 

です。

+0

「d_」はキャプチャされません。 「これは」。 – aschepler

+0

@ascheplerよろしくお願いします。私はこれが今起こっていることをより良く捕捉すると思う。 – NathanOliver

関連する問題