C ++ 0x lambda bắt theo giá trị luôn luôn const?


102

Có cách nào để nắm bắt theo giá trị và làm cho giá trị đã bắt không phải là hằng số không? Tôi có một trình điều khiển thư viện mà tôi muốn nắm bắt và gọi một phương thức không phải là const nhưng phải như vậy.

Phần sau không biên dịch nhưng tạo foo :: operator () const sẽ sửa nó.

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}

Câu trả lời:


165

Sử dụng có thể thay đổi.


auto bar = [=] () mutable -> bool ....

Không có biến đổi, bạn đang khai báo toán tử () của đối tượng lambda const.


-5

Có một cách khác là sử dụng có thể thay đổi (giải pháp do Crazy Eddie đề xuất).

Với [=] khối của bạn nắm bắt tất cả các đối tượng theo giá trị. Bạn có thể sử dụng [&] để chụp tất cả các đối tượng bằng cách tham chiếu:

auto bar = [&] () -> bool

Hoặc bạn có thể chụp bằng cách chỉ tham chiếu đối tượng nhất định [=, & afoo] :

auto bar = [=, &afoo] () -> bool

Tham khảo trang này để biết thêm chi tiết ( phần Giải thích ): http://en.cppreference.com/w/cpp/language/lambda


11
Điều này làm những điều hoàn toàn khác. Chúng không thể thay thế cho nhau. Điều này không trả lời câu hỏi của OP.
Edward Strange

1
Vấn đề của giải pháp này là nó không hoạt động đối với các biến cục bộ bị bắt đã bị phá hủy trước khi lambda được thực thi (ví dụ: khi bạn bắt đầu một chuỗi std :: riêng biệt).
Simon Ninon
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.