lambda 捕获中的值变成常量?

sho*_*osh 4 c++ lambda capture shared-ptr

我有这个简单的代码:

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

auto bla = [s]() {
    s.reset();
};
Run Code Online (Sandbox Code Playgroud)

我的意思是,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_ptrconst shared_ptr

Yks*_*nen 10

当通过复制捕获时,所有捕获的对象都是隐式的const。您必须显式地将 lambda 标记为mutable禁用它:

auto bla = [s]() mutable {
    s.reset();
};
Run Code Online (Sandbox Code Playgroud)

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

auto bla = [&s]() {
    s.reset();
};
Run Code Online (Sandbox Code Playgroud)