我试图按照这个例子使用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)
它不会让我发表评论,因为我没有足够的“点”,但要回复 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)