2016-09-09 13 views
5

Nie wiem, jak to opisać lepiej. Oto kod. To nie kompilator na gcc 4.9.2 (Debian 8.5), ciężko myślę, że skompilowany w poprzedniej wersji. Problem wydaje się występować tylko wtedy, gdy uzyskałem dostęp do później zadeklarowanej struktury jako domyślny argument w konfiguracji lambda. Pozostałe pokazane przypadki działają.Dostęp do dwuetapowego elementu deklaracji lambda

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

Odpowiedz

4

Niestety w auto some_lambda = [&](int arg = d_->a), d_->a nie jest d_->a użyte wcześniej w funkcji ale zamiast d_->a jest nazywany na this przechwyconych za pomocą [&]. Ponieważ jest to zmienna składowa, nie można jej użyć jako domyślnego argumentu w funkcji.

Zasadniczo

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

Czy

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

Jak widać z przeliczenia Wykorzystuje on członkiem klasy, a nie obiekt w samej klasie.

+0

'd_' nie jest przechwytywany. "ten" jest. – aschepler

+0

@aschepler Dobra rozmowa. Myślę, że lepiej oddaje to, co się teraz dzieje. – NathanOliver

Powiązane problemy