This question already has answers here:
Why doesn't shared_ptr permit direct assignment

(5个答案)


3年前关闭。




我发现语法出现编译错误。
std::shared_ptr<int> p = new int(5);

31 41 E:\temprory (delete it if u like)\1208.cpp [Error] conversion from 'int*' to non-scalar type 'std::shared_ptr<int>' requested

但是没关系
std::shared_ptr<int> p(new int(5));

unique_ptr一样;

但是我不知道为什么要禁止它。

最佳答案

带有原始指针的 std::shared_ptr std::unique_ptr 的构造函数是explicitstd::shared_ptr<int> p = new int(5);copy initialization,不考虑explicit构造函数。



对于direct initialization,考虑使用explicit构造函数,然后std::shared_ptr<int> p(new int(5));可以正常工作。

为什么构造函数是explicit

防止意外的隐式转换和所有权转移。例如

void foo(std::unique_ptr<int> p) { ... }

然后
int* pi = new int(5);
foo(pi); // if implicit conversion is allowed, the ownership will be transfered to the parameter p
// then when get out of foo pi is destroyed, and can't be used again

09-30 21:53