为什么我们不能将“=”用于shared_ptr或unique_ptr?

时间:2017-12-08 07:22:23

标签: c++ c++11 initialization shared-ptr unique-ptr

我知道语法有编译错误。

std::shared_ptr<int> p(new int(5));

但它是O.K

unique_ptr

map(menus.slice(0, -1), (el, i) => ...相同;

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

3 个答案:

答案 0 :(得分:12)

获取原始指针的std::shared_ptrstd::unique_ptr的构造函数为explicit; std::shared_ptr<int> p = new int(5);copy initialization,不考虑explicit构造函数。

  

复制初始化比直接初始化更不宽容:显式构造函数不转换构造函数,不考虑复制初始化。

对于direct initializationexplicit构造函数被认为是std::shared_ptr<int> p(new int(5));正常工作。

为什么构造函数是explicit

防止无意的隐式转换和所有权转移。 e.g。

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

答案 1 :(得分:5)

C ++不允许从原始指针复制初始化shared_ptr因为shared_ptr太容易导致从一些任意原始指针到{的意外隐式转换{1}}并未实际管理它。

答案 2 :(得分:4)

想象一下,如果你不小心将int *指针传递给了一个带有std::shared_ptr<int>的函数。函数完成后,指针将被释放。如果您真的想转让所有权,则应明确说明。