2016-09-09 50 views
5

Daha iyi nasıl tanımlanacağını bilmiyorum. İşte kod. Bu gcc 4.9.2 (Debian 8.5) üzerinde derleyici başarısız, daha önceki bir sürümü derlenmiş düşünüyorum. Sorun, yalnızca daha sonra bildirilen yapının üyesine lambda kurulumunda varsayılan bir argüman olarak erişirsem ortaya çıkar. Gösterilen diğer vakalar çalışır.Lambda ayarında iki adımlı bildirilen üyeye erişim

// 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) 
{ 
} 

cevap

4

Maalesef auto some_lambda = [&](int arg = d_->a) yılında, d_->a önceki işlevinde kullanılan d_->a sayı değil de d_->a sen [&] kullanılarak çekilen this çağrıldığı. Bir üye değişkeni olduğundan, bir işlevde varsayılan argüman olarak kullanamazsınız. Eğer sınıf üyesi, sınıf kendisinde değil nesneyi kullanan çeviri görebileceğiniz gibi

Esasen

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}; 

mi.

+0

'd_', yakalanmadı. Bu 'dir. – aschepler

+0

@aschepler Güzel çağrı. Sanırım bu şimdi neler olup bittiğini daha iyi gösteriyor. – NathanOliver