考虑下面的代码,为什么我不能使用 这里的赋值表示法,为什么这被认为是隐式转换。
shared_ptr<string> pNico = new string("nico"); // ERROR implicit conversion
shared_ptr<string> pNico{new string("nico")}; // OK
答案 0 :(得分:4)
构造函数是明确的,以防止某人做这样的事情:
void foo(std::shared_ptr<std::string> s) { }
int main()
{
std::string s;
foo(&s);
}
如果它是隐含的,shared_ptr
可以取得堆栈分配变量的所有权并尝试删除它......这是没有意义的。
答案 1 :(得分:2)
即
template< class Y >
explicit shared_ptr( Y* ptr );
explicit
关键字会阻止复制初始化。
复制初始化时只能使用Converting constructors。