shared_ptr 赋值表示法隐式转换
Posted
技术标签:
【中文标题】shared_ptr 赋值表示法隐式转换【英文标题】:shared_ptr assignment notation implicit conversion 【发布时间】:2016-05-27 18:27:53 【问题描述】:考虑到下面的代码,为什么我不能使用 这里的赋值符号,为什么认为是隐式转换。
shared_ptr<string> pNico = new string("nico"); // ERROR implicit conversion
shared_ptr<string> pNiconew string("nico"); // OK
【问题讨论】:
也许shared_ptr
的原始指针的构造是显式的,这样foo(&obj);
就不会意外地获得obj
的所有权
赋值运算符不为T*
重载,只为其他智能指针
@xvan 这不是任务,而是构造
@PiotrSkotnicki,我认为你的答案是正确的,请你详细解释一下
@Adib 语法 T x = y;
称为 copy-initialization,而 T x(y);
则称为 direct-initialization。复制初始化不仅适用于T x = y;
,还适用于将参数传递给函数,f(y);
,例如void f(T x)
。 explicit
说明符可防止复制初始化中可能发生的隐式转换。我相信它是故意为shared_ptr
制作的,原因我提到了
【参考方案1】:
构造函数是明确的,以防止有人做这样的事情:
void foo(std::shared_ptr<std::string> s)
int main()
std::string s;
foo(&s);
如果它是隐式的,shared_ptr
可以获取堆栈分配变量的所有权并尝试删除它..这是没有意义的。
【讨论】:
【参考方案2】:查看constructors declarations:
即
template< class Y >
explicit shared_ptr( Y* ptr );
explicit
关键字阻止复制初始化。
只有Converting constructors 可以用于复制初始化。
【讨论】:
以上是关于shared_ptr 赋值表示法隐式转换的主要内容,如果未能解决你的问题,请参考以下文章