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

C++中用=初始化std::unique_ptr<int>报错,{}初始化正常,二者差异何在?

为什么std::unique_ptr用=初始化报错,用{}却正常?

核心原因是std::unique_ptr的构造函数被**explicit**关键字修饰,这直接导致了两种初始化方式的差异:

  • 等号初始化(拷贝初始化):std::unique_ptr<int> ptr_obj = new int{10};
    这种初始化方式会触发隐式转换尝试——编译器试图把右侧的int*裸指针隐式转换成std::unique_ptr<int>类型。但explicit修饰的构造函数会禁止这种隐式转换,目的是防止意外将裸指针绑定到智能指针(比如误赋值导致的内存管理混乱),所以编译器抛出「无法从int*转换到非标量类型std::unique_ptr」的错误。

  • 大括号初始化(直接初始化):std::unique_ptr<int> ptr_obj{new int{10}};
    这属于直接初始化,是显式调用构造函数的行为。explicit构造函数允许被显式调用,所以编译器会直接用int*参数调用unique_ptr的构造函数,完成初始化,因此编译通过。

额外建议:实际开发中更推荐用std::make_unique<int>(10)来创建unique_ptr,它比直接用new更安全,能避免因构造过程中抛出异常导致的内存泄漏问题。

内容的提问来源于stack exchange,提问作者Ussu20

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:07