shared_ptr赋值表示法隐式转换

时间:2016-05-27 18:27:53

标签: c++ c++11 shared-ptr explicit

考虑下面的代码,为什么我不能使用 这里的赋值表示法,为什么这被认为是隐式转换。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

检查constructors declarations

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

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

复制初始化时只能使用Converting constructors