《美国大片:不仅仅是视觉盛宴,更是时代精神的缩影》

核心内容摘要

xrksp.apk3.0免费版
潜入“鉴黄社区”:一次关于艺术、尺度与边界的深度探索

那些年,我们追过的“吴梦梦”:一场关于流量与审美的全民狂欢

提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录核心原理unique_ptr 禁止拷贝但允许「移动」用代码验证拷贝 vs 移动的区别

合法场景移动/返回值优化你的例子

非法场景尝试拷贝左值编译失败补充为什么 make_unique 更安全

总结你想弄明白的核心问题是unique_ptr本身禁止拷贝赋值但auto product createProduct();这句代码却能把函数返回的unique_ptr赋值给变量这看起来矛盾其实核心原因是这里不是拷贝而是 C 的移动语义 返回值优化。

核心原理unique_ptr禁止拷贝但允许「移动」unique_ptr的设计初衷是独占所有权所以它明确禁用了拷贝构造函数和拷贝赋值运算符被声明为delete但它提供了移动构造函数和移动赋值运算符专门用来处理「所有权转移」的场景——尤其是针对临时对象右值。

具体到这个例子拆解来看createProduct()函数返回的是一个临时的unique_ptrProduct对象没有名字的右值C 标准规定当用一个右值临时对象初始化/赋值另一个unique_ptr时编译器会自动调用「移动构造函数」把临时对象的所有权转移给新对象而不是拷贝更优的是编译器还会触发返回值优化NRVO/NRVO直接在main函数的product变量内存位置构造unique_ptr连移动操作都跳过效率和直接构造几乎无差别。

用代码验证拷贝 vs 移动的区别我们可以通过对比代码更直观地看到差异

合法场景移动/返回值优化你的例子#includememory#includeiostreamclassProduct{public:~Product(){std::coutProduct destroyed\n;}};std::unique_ptrProductcreateProduct(){returnstd::unique_ptrProduct(newProduct());}intmain(){// 合法接收函数返回的临时unique_ptr右值触发移动/返回值优化autoproductcreateProduct();return0;}

非法场景尝试拷贝左值编译失败intmain(){autop1std::make_uniqueProduct();// 编译错误p1是具名的左值unique_ptr禁止拷贝赋值// auto p2 p1;// 正确的做法显式移动所有权转移autop2std::move(p

;// p1失去所有权变为空p2获得所有权return0;}补充为什么make_unique更安全你代码里注释提到C14的make_unique更安全这里顺带解释原写法return std::unique_ptrProduct(new Product());存在极小的异常安全风险比如new Product()成功但unique_ptr构造前抛出异常导致内存泄漏make_unique是将「内存分配」和「智能指针对象构造」封装在一个函数里是原子操作彻底避免了这种风险且写法更简洁。

修改后的更优版本#includememory#includeiostreamclassProduct{public:~Product(){std::coutProduct destroyed\n;}};// C14及以上推荐写法std::unique_ptrProductcreateProduct(){returnstd::make_uniqueProduct();// 更安全、更简洁}intmain(){autoproductcreateProduct();// 依然是移动/返回值优化合法return0;}

总结unique_ptr禁止拷贝左值之间的赋值/构造但允许移动右值/临时对象的所有权转移auto product createProduct();合法的原因函数返回的是临时unique_ptr右值编译器自动触发移动构造/返回值优化而非拷贝具名的unique_ptr若要转移所有权必须显式使用std::move否则编译失败。

这也是unique_ptr既保证「独占所有权」又能灵活转移所有权的核心设计。

std::unique_ptr本身也是个类里面知识没有拷贝构造函数但有移动构造函数 createProduct();返回的就是一个右值 这个过程走移动构造 所以没问题 std::unique_ptr本身就是移动语义应用层面的一个很好的例子感觉

9·1直接打开蓝莓-9·1直接打开蓝莓应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123