












现在的代码(错误版)
std::unique_ptr k = std::make_unique(11);
std::function<std::unique_ptr()> lambda_ = w= std::move(k)->std::unique_ptr
{
return std::move(w);
};
编译失败的根本原因:
✖ std::function 存储的 lambda 必须是可拷贝的
但你这个 lambda 内部持有 std::unique_ptr →
unique_ptr 不可拷贝 → lambda 不可拷贝 → 不能放进 std::function
这是 C++ 非常经典的坑!
#include
#include
int main() {
std::unique_ptr k = std::make_unique(11);
std::function<std::shared_ptr()> lambda_ =
[p = std::make_shared(std::move(*k))]() -> std::shared_ptr {
return p;
};
}
std::unique_ptr<int> k = std::make_unique<int>(11);
// 不用 std::function,直接 auto
auto lambda_ = w = std::move(k) -> std::unique_ptr {
return std::move(w);
};
✅ 这个 100% 编译通过、运行正常
为什么你的代码不能用 std::function?
规则铁律:
std::function 要求包装的对象必须能拷贝
持有 unique_ptr 的 lambda 不能拷贝
→ 冲突 → 编译失败
这不是你写错语法,而是C++ 设计如此。
最终你能直接用的【完美版代码】
cpp
运行
int main() {
std::unique_ptr k = std::make_unique(11);
// 正确写法:不用 function,直接 auto
auto lambda_ = w = std::move(k) -> std::unique_ptr {
return std::move(w);
};
// 调用测试
auto ptr = lambda_();
std::cout << *ptr << std::endl; // 输出 11
}
总结(一句话记住)
持有 std::unique_ptr 的 lambda → 不能放进 std::function
要存只能用:
auto 直接接收
或改用 shared_ptr
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。