shared_ptr 赋值符号隐式转换

shared_ptr assignment notation implicit conversion

考虑以下代码,为什么我不能使用 这里的赋值符号,为什么认为是隐式转换。

shared_ptr<string> pNico = new string("nico"); // ERROR implicit conversion
shared_ptr<string> pNico{new string("nico")};   // OK

构造函数是明确的,以防止有人做这样的事情:

void foo(std::shared_ptr<std::string> s) { }

int main()
{
   std::string s;
   foo(&s);
}

如果它是隐式的,shared_ptr 可以获取堆栈分配变量的所有权并尝试删除它..这是没有意义的。

勾选 constructors declarations:

template< class Y >
explicit shared_ptr( Y* ptr );

explicit 关键字阻止复制初始化。

只有Converting constructors可以用于复制初始化。