如果唯一指针是捕获的值,为什么它不能在 lambda 内移动?
Why is a unique pointer not movable inside a lambda if it's a captured value?
以下代码无法编译:
struct S{};
void foo(std::unique_ptr<S> ptr)
{
auto l = [p = std::move(ptr)]()
{
auto p2 = std::move(p);
};
l();
}
原因是std::move(p)
返回一个左值引用,因此编译器尝试调用复制构造函数,该构造函数被删除。为什么move
在这里返回左值引用?
这是一个完整的示例。
将 lambda 标记为mutable
,否则其捕获const
。如在
auto l = [p = std::move(ptr)]() mutable { ... };
相关文章:
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 为什么不能使用带有模板的 lambda
- 变量不能在 lambda 中隐式捕获,并且没有使用 switch 语句指定捕获默认值
- 如果唯一指针是捕获的值,为什么它不能在 lambda 内移动?
- 为什么我不能使用 lambda 按值对 std::map 进行排序
- 不能从lambda构建
- lambda 中的 lambda 不能是模板
- C++不能从映射调用 lambda 表达式
- 为什么在传递lambda而不是功能指针时不能推断模板参数
- 通用 lambda 不能在命名空间中使用
- 为什么我不能在递归 lambda 函数中使用 auto
- 为什么初始化捕获可变 lambda 不能具有可变数据成员?
- 具有非静态 lambda 成员的类不能使用默认模板参数?
- 函数模板可用于本地lambda,但不能用于其他函数
- 为什么不能在 lambda 中使用私有方法
- 目标C++ 11 - 为什么我们不能给 lambda 分配一个块?
- 为什么 std::generate 将与 lambda 生成器一起使用,而 std::fill 则不能
- 我不能将lambda作为std::function传递