我有这个简单的代码:
std::shared_ptr<std::string> s; auto bla = [s]() { s.reset(); };
字符串我的意思是,shared_ptr被lambda捕获,然后在lambda被调用时重置。用VS编译它会产生以下错误:第一个月怎么回事?为什么shared_ptr变成了const shared_ptr?
shared_ptr
const shared_ptr
yftpprvb1#
当通过复制捕获时,所有捕获的对象都是隐式的const。你必须显式地将lambda标记为mutable来禁用它:
const
mutable
auto bla = [s]() mutable { s.reset(); };
字符串另外,如果你想重置实际的s而不是一个副本,你想通过引用捕获。当通过引用捕获时,你不需要mutable,在这种情况下,常数是从实际对象推断出来的:
s
auto bla = [&s]() { s.reset(); };
型
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?
2条答案
按热度按时间yftpprvb1#
当通过复制捕获时,所有捕获的对象都是隐式的
const
。你必须显式地将lambda标记为mutable
来禁用它:字符串
另外,如果你想重置实际的
s
而不是一个副本,你想通过引用捕获。当通过引用捕获时,你不需要mutable
,在这种情况下,常数是从实际对象推断出来的:型
x6h2sr282#
在C++17中,你可以这样做。
字符串
它来自这个。
Lambda: Why are captured-by-value values const, but capture-by-reference values not?