This question already has answers here:
Why doesn't shared_ptr permit direct assignment
(5个答案)
3年前关闭。
我发现语法出现编译错误。
但是没关系
和
但是我不知道为什么要禁止它。
然后
(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
的构造函数是explicit
; std::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