getId(); auto new_e-6ren">
gpt4 book ai didi

c++ - 错误 : variable "cannot be implicitly captured because no default capture mode has been specified"

转载 作者:IT老高 更新时间:2023-10-28 14:00:22 26 4
gpt4 key购买 nike

我正在尝试关注 this example使用带有 remove_if 的 lambda。这是我的尝试:

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());

但是编译失败:

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

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

最佳答案

您必须指定要捕获的 flagId。这就是 [] 部分的用途。现在它没有捕获任何东西。您可以按值或按引用捕获 ( more info )。比如:

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

通过引用捕获。如果你想通过 const 值捕获,你可以这样做:

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

或者通过可变值:

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

遗憾的是,在 C++17 之前,没有直接的方法可以通过 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

在 C++17 及更高版本中,我们可以使用 as_const 通过 const-reference 捕获

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

关于c++ - 错误 : variable "cannot be implicitly captured because no default capture mode has been specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com