Khi mà điều này, thì điều này được bắt bởi lambda, nó có phải được sử dụng rõ ràng không?


27

Các ví dụ tôi đã thấy rằng việc chụp thistrong lambda sử dụng nó một cách rõ ràng; ví dụ:

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

Nhưng có vẻ như cũng có thể sử dụng nó một cách ngầm định; ví dụ:

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

Tôi đã thử nghiệm điều này trong g ++, và nó được biên dịch.

Đây có phải là C ++ chuẩn không? (và nếu vậy, phiên bản nào), hoặc nó là một dạng mở rộng?


1
Các câu trả lời là chính xác, nhưng có một lý do có thể để sử dụng this->rõ ràng, đó là để đảm bảo rằng các giá trị được nắm bắt rõ ràng được sử dụng rõ ràng. Lưu ý rằng [](){ calstage1done(); }sẽ không hợp pháp, vì thissẽ không bị bắt; nhưng khi chụp thismột cách rõ ràng, thật đáng ngạc nhiên khi thân hàm xuất hiện trong nháy mắt không thực sự sử dụng giá trị đã chụp : [this](){ calstage1done(); }.
Kyle Strand

Tôi có thể thấy điều này, nhưng đồng thời nó có vẻ dài dòng khủng khiếp cho những gì nên là một nhiệm vụ đơn giản.
cắm vào

1
Tôi nhớ MSVC (có lẽ chỉ 2015) cũng gặp vấn đề với việc bắt thisvà sử dụng nó trong lambda, đó cũng có thể là một lý do để sử dụng nó một cách rõ ràng
Flamefire

@plugwash: Các nhà phát triển có xu hướng luôn lười biếng và muốn giảm thiểu mọi thứ, và các nhà thiết kế ngôn ngữ cũng không khác. Tuy nhiên, tính dài dòng thường được yêu cầu để giải quyết sự mơ hồ, và đó là trường hợp ở đây.
Flater

Câu trả lời:


25

Nó là tiêu chuẩn và đã được theo cách này kể từ C ++ 11 khi lambdas được thêm vào. Theo cppreference.com :

Với mục đích tra cứu tên, xác định loại và giá trị của thiscon trỏ và để truy cập các thành viên lớp không tĩnh, phần thân của toán tử gọi hàm kiểu đóng được xem xét trong ngữ cảnh của biểu thức lambda.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.