2014-09-19 17 views
20

Czy inline inline inicjał lambda może przechwycić i użyć wskaźnika this?Czy inline inicjator lambda może przechwycić "ten" wskaźnik?

struct A{ 
    int a = 42; 
    int b = [this](){ 
    return this->a * 4; 
    }(); 
}; 

Czy jest to prawidłowy kod C++ 11 (zgodnie ze specyfikacją) czy jest to tylko rozszerzenie GCC?

Jeśli jest ważna, dlaczego muszę korzystać z numeru this-> w odniesieniu do członka a?

+1

Tego rodzaju pytania należy pisać na StackOverflow! Witamy! :) – Mikhail

+0

łatwe do sprawdzenia z opcją '-pedantic'a –

+0

Działa z' -pedantic' z GCC 4.7 i clang 3.2 – p2rkw

Odpowiedz

16

Czy jest prawidłowy kod C++ 11?

Nie tylko lambda w zakresie blok może mieć przechwytywania listę:

C++ 11 5.1.2/9A lambda ekspresji którego najmniejszy zakres zamykający jest zakres bloku jest lokalne wyrażenie lambda; jakakolwiek inna ekspresja lambda nie będzie zawieraław swoim wprowadzającym lambda wprowadzającym lambda.

Wygląda na to, że jest to rozszerzenie GCC. (Jak zauważył w komentarzach, to jest open issue, więc może dobrze się standardem jeden dzień.)

dlaczego muszę używać this-> odnosząc się do członka?

Nie, przynajmniej z wersją GCC używam: http://ideone.com/K857VC.

+0

Przypuszczam, że N3797 zostało nieco sformułowane: 'Wyrażenie lambda, którego najmniejszy zakres obejmujący to zakres blokowy (3.3.3) jest lokalnym wyrażeniem lambda; każde inne wyrażenie lambda nie będzie miało domyślnego lub zwykłego przechwytywania w swoim wprowadzającym lambdę. " –

+0

@MarcoA .: Dzięki, chciałem tylko sprawdzić, czy to się zmieni w C++ 14. To nie zmienia odpowiedzi; nadal nie możesz uchwycić 'this' (będącego * prostym przechwytywaniem *) w nielokalnej lambda. –

+1

OTOH, ponieważ NSDMI są zasadniczo cukrem syntetycznym dla listy inicjalizującej członków konstruktora, można argumentować, że skutecznie ma zasięg blokowy (lub coś podobnego do niego) ... –

Powiązane problemy