2015-05-13 13 views
23

Tôi đang cố gắng theo dõi this example để sử dụng lambda với remove_if. Đây là nỗ lực của tôi:Lỗi: biến "không thể bị ẩn hoàn toàn vì không có chế độ chụp mặc định nào được chỉ định"

int flagId = _ChildToRemove->getId(); 
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
     [](Flag& device) { 
      return device.getId() == flagId; 
     }); 

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end()); 

nhưng điều này không biên dịch:

error C3493: 'flagId' cannot be implicitly captured because no default capture mode has been specified 

Làm thế nào tôi có thể bao gồm các thông số bên ngoài, flagId, trong biểu thức lambda?

+3

Chế độ chụp mặc định là '[=]' (theo giá trị) và '[&]' (theo tham chiếu). '[]' có nghĩa là không chụp. – MSalters

Trả lời

46

Bạn phải chỉ định flagId để được chụp. Đó là phần của phần []. Ngay bây giờ nó không nắm bắt bất cứ điều gì. Bạn có thể chụp (more info) theo giá trị hoặc tham chiếu. Một cái gì đó như:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
     [&flagId](Flag& device) 
    { return device.getId() == flagId; }); 

Chụp bằng tham chiếu. Nếu bạn muốn chụp bằng giá trị const, bạn có thể làm điều này:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
     [flagId](Flag& device) 
    { return device.getId() == flagId; }); 

Hoặc theo giá trị có thể thay đổi:

auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
     [flagId](Flag& device) mutable 
    { return device.getId() == flagId; }); 

Đáng buồn là không có cách nào đơn giản để nắm bắt bằng cách tham chiếu const. Cá nhân tôi sẽ chỉ khai báo một tham chiếu const tạm thời và nắm bắt điều đó bằng cách ref:

const auto& tmp = flagId; 
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), 
      [&tmp](Flag& device) 
     { return device.getId() == tmp; }); //tmp is immutable 
Các vấn đề liên quan