【发布时间】:2023-04-03 07:37:01
【问题描述】:
将std::unique_ptr 移动到 lambda 中时,无法在其上调用 reset(),因为它似乎是 const :
error C2662: void std::unique_ptr<int,std::default_delete<_Ty>>::reset(int *) noexcept': cannot convert 'this' pointer from 'const std::unique_ptr<int,std::default_delete<_Ty>>' to 'std::unique_ptr<int,std::default_delete<_Ty>> &
#include <memory>
int main()
{
auto u = std::unique_ptr<int>();
auto l = [v = std::move(u)]{
v.reset(); // this doesn't compile
};
}
- 为什么会这样?
- 是否可以通过另一种方式捕获
std::unique_ptr,允许在 lambda 中调用reset()(使用 C++17 或更高版本)?
【问题讨论】:
-
但是为什么呢?当 lambda 超出范围时,
v不会自动重置吗? -
@L.F.是的,它的析构函数与
constptr 一起工作。但是,如果指针的生命周期需要在作用域结束之前结束(或者应该分配另一个指针或者应该将托管对象的所有权转移给另一个 unique_ptr),则需要一个非常量的 unique_ptr。跨度>
标签: c++ c++11 lambda unique-ptr capture-list