c++ 在lambda捕获中将value转换为const?

htzpubme  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(123)

我有这个简单的代码:

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

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

字符串
我的意思是,shared_ptr被lambda捕获,然后在lambda被调用时重置。
用VS编译它会产生以下错误:
第一个月
怎么回事?为什么shared_ptr变成了const shared_ptr

yftpprvb

yftpprvb1#

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

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

字符串
另外,如果你想重置实际的s而不是一个副本,你想通过引用捕获。当通过引用捕获时,你不需要mutable,在这种情况下,常数是从实际对象推断出来的:

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

x6h2sr28

x6h2sr282#

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

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

字符串
它来自这个。
Lambda: Why are captured-by-value values const, but capture-by-reference values not?

相关问题