我知道语法有编译错误。
std::shared_ptr<int> p(new int(5));
但它是O.K
unique_ptr
与map(menus.slice(0, -1), (el, i) => ...
相同;
但我不知道为什么禁止它。
答案 0 :(得分:12)
获取原始指针的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
?防止无意的隐式转换和所有权转移。 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>
的函数。函数完成后,指针将被释放。如果您真的想转让所有权,则应明确说明。