我有一个使用lambda表达式的函数。
std::vector<Bar*> mBars;
void foo(Bar* bar)
{
auto duplicateBars = std::remove_if(mBars.begin(), mBars.end(),
[bar] (const Bar* const &element)
{
return bar == element;
});
mBars.erase(duplicateBars, mBars.end());
}
稍后,我审查了代码并意识到可以在foo的签名中添加两个常量。
void foo(const Bar* const bar);
bar
的指针和数据现在是常量,但是对于lambda表达式来说,指针本身是常量,因为我通过值捕获。然而,指向的数据可以被更改,因为lambda捕获中不允许使用const
。这对我来说有些不直观。我的理解正确吗?我可以使用第二个签名,但是无法保护lambda表达式中的数据免受更改。
foo
定义为foo(Bar const * const bar)
,那么你不能使用被 lambda 捕获的bar
来修改传递给foo
的指针所指向的任何内容。 - Praetorian[bar] (const Bar* element)
作为lambda函数,以及void foo(const Bar* bar)
。现在两者都是常量。 - Bruno Ferreira