在 lambda 捕获中值变成 const?
value turned const in lambda capture?
我有这个简单的代码:
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
?
复制捕获时,所有捕获的对象都是隐式的const
。您必须将 lambda 显式标记为 mutable
才能禁用它:
auto bla = [s]() mutable {
s.reset();
};
此外,如果您想重置实际 s
而不是副本,您需要通过引用捕获。通过引用捕获时不需要 mutable
,在这种情况下,constness 是从实际对象推断出来的:
auto bla = [&s]() {
s.reset();
};
我有这个简单的代码:
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
?
复制捕获时,所有捕获的对象都是隐式的const
。您必须将 lambda 显式标记为 mutable
才能禁用它:
auto bla = [s]() mutable {
s.reset();
};
此外,如果您想重置实际 s
而不是副本,您需要通过引用捕获。通过引用捕获时不需要 mutable
,在这种情况下,constness 是从实际对象推断出来的:
auto bla = [&s]() {
s.reset();
};