错误:变量"无法隐式捕获,因为未指定默认捕获模式"

use*_*898 49 c++ lambda c++11

我试图按照这个例子使用lambda remove_if.这是我的尝试:

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());
Run Code Online (Sandbox Code Playgroud)

但这无法编译:

error C3493: 'flagId' cannot be implicitly captured because no default capture mode has been specified
Run Code Online (Sandbox Code Playgroud)

如何flagId在lambda表达式中包含外部参数?

And*_*dyG 83

您必须指定flagId要捕获.这就是该[]部分的用途.现在它没有捕获任何东西.您可以按值或按引用捕获(更多信息).就像是:

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

其中通过引用捕获.如果要按const值捕获,可以执行以下操作:

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

或者通过可变值:

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

遗憾的是,没有直接的方法来捕获const引用.我个人只会声明一个临时的const ref并通过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
Run Code Online (Sandbox Code Playgroud)


Dav*_*ien 8

它不会让我发表评论,因为我没有足够的“点”,但要回复 AndyG,现在有一种简单的方法可以通过常量引用进行捕获:

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