在 lambda 捕获中值变成了 const?

问题描述 投票:0回答:2

我有这个简单的代码:

std::shared_ptr<std::string> s;

auto bla = [s]() {
    s.reset();
};

我的意思是,shared_ptr 被 lambda 捕获,然后在调用 lambda 后重置。
用 VS 编译会产生以下错误:

error C2662: 'void std::shared_ptr<std::string>::reset(void) noexcept': cannot convert 'this' pointer from 'const std::shared_ptr<std::string>' to 'std::shared_ptr<std::string> &' 1>...: message : Conversion loses qualifiers

什么给予?怎么

shared_ptr
变成了
const shared_ptr

c++ lambda shared-ptr capture
2个回答
8
投票

通过复制捕获时,所有捕获的对象都是隐式的

const
。您必须明确地将 lambda 标记为
mutable
才能禁用它:

auto bla = [s]() mutable {
    s.reset();
};

此外,如果您想重置实际的

s
而不是副本,您需要通过引用捕获。通过引用捕获时不需要
mutable
,在这种情况下,常量是从实际对象推断出来的:

auto bla = [&s]() {
    s.reset();
};

0
投票

在C++17中,你可以这样做:

vector<int>a;
auto lambda = [a=std::as_const(a)](){};

它来自于:Lambda:为什么按值捕获的值是const,而按引用捕获的值不是const?

© www.soinside.com 2019 - 2024. All rights reserved.