You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非可拷贝可移动类型的容器构造方式选择:传值与右值引用对比及异常安全示例需求

非可拷贝可移动类型的容器构造方式选择:传值与右值引用对比及异常安全示例需求

我最近碰到个困惑想请教大家:我有一个不可拷贝但可移动的Handle类型,现在纠结把它作为参数传给容器构造函数时,到底该用传值还是右值引用的方式。之前看到这么一句话:

should the constructor exit by throwing an exception, the resource will be disposed of

这句话让我意识到传值可能有右值引用比不了的优势,但我实在搞不懂这句话具体指什么,希望能有一个可运行的示例帮我理清这个点。

先给大家看看我的Handle类定义:

class Handle {
public:
    explicit Handle(/* ... */) {};
    Handle(Handle&&) = default;
    Handle(Handle&) = delete;
    Handle copy() { return Handle(/* ... */); };
};

目前我有两种容器的定义方案:

  • 方案一:传值构造,再移动到成员变量
class Container {
public:
    Container(Handle handle): mHandle(std::move(handle)) {}
    Handle mHandle;
};
  • 方案二:传右值引用构造,再移动到成员变量
class Container {
public:
    Container(Handle&& handle): mHandle(std::move(handle)) {}
    Handle mHandle;
};

想请大家帮我写一个可运行的示例,演示前面那句引用的话在这两种方案下的区别——也就是当构造函数抛出异常时,资源会如何处理,为什么传值的方式在异常安全上更有优势?

备注:内容来源于stack exchange,提问作者Jonas Wilms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 11:15:29