“Bu” bir lambda tarafından ele geçirildiğinde, açıkça kullanılması gerekir mi?


27

thisBir lambdadaki yakalamanın onu açıkça kullandığını bulduğum örnekler ; Örneğin:

capturecomplete = [this](){this->calstage1done();};

Ancak örtük olarak kullanmak da mümkün görünüyor; Örneğin:

capturecomplete = [this](){calstage1done();};

Bunu g ++ 'da test ettim ve derledi.

Bu standart C ++ mı? (ve öyleyse, hangi sürüm) veya bir çeşit uzantı mıdır?


1
Yanıtlar doğrudur, ancak this->açıkça kullanılmasının olası bir nedeni vardır , bu da açıkça yakalanan değerlerin açıkça kullanılmasını sağlamaktır. Bunun [](){ calstage1done(); }yasal thisolmayacağını , çünkü yakalanmayacağını unutmayın; çekerken fakat thisaçıkça fonksiyon vücut için, bu şaşırtıcı görünebilir aslında yakalanan değeri kullanmak değil bir bakışta: [this](){ calstage1done(); }.
Kyle Strand

Bunu bir şekilde görebiliyorum, ama aynı zamanda basit bir görev olması gereken şey için korkunç bir ayrıntı gibi görünüyor.
plugwash

1
MSVC'yi (belki de sadece 2015) de thisbir
lambdada

@plugwash: Geliştiriciler her zaman tembel olma eğilimindedir ve işleri en aza indirgemek ister ve dil tasarımcıları da farklı değildir. Bununla birlikte, belirsizliği çözmek için genellikle ayrıntı düzeyi gereklidir ve burada durum böyledir.
flater

Yanıtlar:


25

Standarttır ve lambdalar eklendiğinde C ++ 11'den beri bu şekilde olmuştur. Cppreference.com'a göre :

Ad arama, thisişaretçinin türünü ve değerini belirlemek ve statik olmayan sınıf üyelerine erişmek için, kapatma türünün işlev çağrısı operatörünün gövdesi, lambda ifadesi bağlamında dikkate alınır.

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.