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
相关产品推荐
相关产品推荐

