เมื่อแลมบ์ดาจับตัวนี้แล้วจะต้องใช้อย่างชัดเจนหรือไม่?


27

ตัวอย่างที่ฉันพบว่าการจับภาพthisในแลมบ์ดาใช้อย่างชัดเจน เช่น:

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

แต่ดูเหมือนว่ามันเป็นไปได้ที่จะใช้มันโดยปริยาย เช่น:

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

ฉันทดสอบสิ่งนี้ใน g ++ และรวบรวมมัน

C ++ มาตรฐานนี้หรือไม่ (และถ้าเป็นเช่นนั้นเวอร์ชันใด) หรือเป็นรูปแบบของส่วนขยายบางส่วน


1
คำตอบนั้นถูกต้อง แต่มีเหตุผลที่เป็นไปได้สำหรับการใช้this->อย่างชัดเจนซึ่งก็เพื่อให้แน่ใจว่ามีการใช้ค่าที่บันทึกไว้อย่างชัดเจน โปรดทราบว่า[](){ calstage1done(); }จะไม่ถูกกฎหมายเพราะthisจะไม่ถูกจับกุม แต่เมื่อจับภาพthisอย่างชัดเจนก็น่าแปลกใจสำหรับร่างกายของฟังก์ชั่นที่จะปรากฏ[this](){ calstage1done(); }ได้อย่างรวดเร็วไม่จริงใช้ค่าที่บันทึก:
Kyle Strand

ฉันสามารถมองเห็นสิ่งนี้ได้ แต่ในเวลาเดียวกันดูเหมือนว่าจะเป็นเรื่องที่น่ากลัวสำหรับสิ่งที่ควรเป็นงานง่าย ๆ
plugwash

1
ฉันจำ MSVC (อาจจะแค่ปี 2015) ยังมีปัญหาเกี่ยวกับการจับภาพthisและการใช้งานในแลมบ์ดาซึ่งอาจเป็นเหตุผลที่จะใช้อย่างชัดเจน
Flamefire

@plugwash: นักพัฒนามักจะขี้เกียจและต้องการลดสิ่งต่าง ๆ และนักออกแบบภาษาก็ไม่แตกต่างกัน อย่างไรก็ตามการใช้คำฟุ่มเฟื่อยมักจะต้องแก้ไขความคลุมเครือและเป็นกรณีที่นี่
Flater

คำตอบ:


25

เป็นมาตรฐานและเป็นเช่นนี้มาตั้งแต่ C ++ 11 เมื่อเพิ่ม lambdas ตามcppreference.com :

สำหรับวัตถุประสงค์ของการค้นหาชื่อการกำหนดชนิดและค่าของ thisตัวชี้และสำหรับการเข้าถึงสมาชิกคลาสที่ไม่คงที่เนื้อความของตัวดำเนินการเรียกฟังก์ชันของประเภทการปิดจะถูกพิจารณาในบริบทของการแสดงออกแลมบ์ดา

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.