2011-10-19 14 views
8

Rozważmy następujący kod:Dlaczego nie udało mi się uchwycić "tego" wskaźnika przez lambdę?

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
      { 
       A * a = this; 
       auto functor = [a]() // The compiler won't accept "this" instead of "a" 
        { 
         a->bar(); 
        }; 
      }; 
    } 

    void bar() {} 
}; 

W VC2010, używając this zamiast a prowadzić do błędów kompilacji. Między innymi:

1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope 
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified 

Których nie rozumiem. Czy to oznacza, że ​​nie wie, czy powinien użyć referencji, czy skopiować? Gdy próbuje użyć &this zmusić odniesienie, mówi także:

1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored 

Tymczasowy nie jest to irytujące, ale ze względu na ciekawość, czy jest jakiś sposób, aby się go pozbyć? Co się dzieje, gdy this podaje się lambda?

+2

Działa poprawnie w GCC 4.6.1, nawet z '[this]'. –

+0

@KerrekSB Warto wiedzieć ... Dzięki za test! – Gabriel

+4

Wygląda to na [błąd # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (niestety zamknięty jako 'WONTFIX'). –

Odpowiedz

6

Wygląda na to, że jest to błąd kompilatora w VS2010. Udało mi się zrobić to praca, pozwalając wewnętrzną lambda niejawnie uchwycić this:

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
     { 
      auto functor = [=]() 
      { 
       bar(); 
      }; 
     }; 
    } 

    void bar() {} 
}; 

Gdy próbuje użyć & tego zmusić przedstawieniu, mówi także:

1> główny. CPP (20): error C3496: 'to' jest zawsze schwytany przez wartość: '&' ignorowane

this można przechwycić tylko według wartości. [=] i [&] oba przechwytują to według wartości.

Co się dzieje, gdy podaje się je lambda?

Nie wiem, ale musi to być coś specjalnego, ponieważ nie można użyć this w lambda jako wskaźnika do obiektu lambda. Cokolwiek innego przechwycone staje się prywatnym członkiem lambda tak prawdopodobnie this robi również, ale jest pewne specjalne obchodzenie się z użyciem.

2

This is a known bug with the Visual Studio 2010 compiler (zgodnie z komentarzem Frédéric Hamidi).

Musisz jawnie przechwycić this, aby przekazać go innej specyfikacji przechwytywania lamba. Dotyczy to również zmiennych lokalnych zadeklarowanych poza lambdą zawierającą lambdę, nawet ze specyfikacją przechwytywania [&].

Powiązane problemy