2015-02-17 10 views
11

ngay bây giờ tôi có một chức năng đối tượng với một lambda, để sử dụng chức năng thành viên và biến tôi sẽ phải (hoặc tất nhiên chụp tất cả ..):chụp const này

void MyClass::MyFunc() { 

    auto myLambda = [this](){...}; 
} 

Có cách nào một cách rõ ràng nhà nước để nắm bắt một const này? Tôi biết tôi có thể:

void MyClass::MyFunc() { 
    MyClass const* const_my_class = this; 
    auto myLambda = [const_my_class](){...}; 
} 

Cảm ơn.

+0

Tôi sẽ ngạc nhiên nếu có cách nào tốt hơn để thực hiện việc này, nhưng sẽ rất thú vị khi chờ xem liệu có ai đó có thể đến với nó hay không. – Photon

+0

Nó sẽ có vẻ tầm thường mà bạn cần nó đặc biệt là khi làm các mục như parallel_for_each .. – Alon

+0

này sẽ là hằng số nếu MyFunc của bạn là hằng số. Tôi giả sử nó sẽ là vì bạn cần điều này là const – Rado

Trả lời

4

mỗi §5.1.2 trong tiêu chuẩn (N3485), định nghĩa về lambda-chụp là:

 
lambda-capture: 
    capture-default 
    capture-list 
    capture-default , capture-list 
capture-default: 
    & 
    = 
capture-list: 
    capture ... opt 
    capture-list , capture ... opt 
capture: 
    identifier 
    & identifier 
    this 

Vì vậy, bạn chỉ có thể có =, &, this, định danh, &số nhận dạng trong danh sách chụp. Bạn không thể có biểu thức, ví dụ: đúc this đến const.

Một số biểu thức đơn giản trong danh sách chụp trong các phiên bản cao hơn (-std=c++1y) là avaiable, ví dụ:

auto myLambda = [self = static_cast<MyClass const*>(this)](){ 

    // Use `self` instead of `this` which is `const` 

}; 

Tất nhiên, nó không thích chụp this mà bạn có thể truy cập vào các thành viên như giống như các biến địa phương.

Các vấn đề liên quan