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(&amp;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 赋值表示法隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

何谓隐式类型转换?其转换规则如何?

145-显式转换和隐式转换

C的隐式类型转换

C语言数据类型转换规则(隐式转换+显式转换)

第五篇:你“ 看不见 ” 的隐式转换

消失的重量(隐式变换)