cplusplus.com shared_ptr page指出空std::shared_ptr和空shared_ptr之间的区别。 cppreference.com page并未明确指出区别,但在nullptr行为描述中同时使用了“空”和与std::shared_ptr的比较。

shared_ptr和空shared_ptr之间有区别吗?这种混合行为指针有什么用例?非空的shared_ptr甚至有意义吗?正常使用情况下(即如果您没有明确构造一个)会以空但非空的ojit_code结尾吗?

如果您使用的是Boost版本而不是C++ 11版本,这些答案是否会改变?

最佳答案

这是shared_ptr行为的怪异角落。它具有一个构造函数,可让您制作一个拥有某些内容并指向其他内容的shared_ptr:

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

使用此构造函数构造的shared_ptrr共享所有权,但指向ptr指向的任何内容(即,调用get()operator->()将返回ptr)。这对于ptr指向r拥有的对象的子对象(例如,数据成员)的情况非常方便。

您链接的页面称为shared_ptr,不包含任何空白,而shared_ptr指向不包含任何内容(即get() == nullptr)为空。 (标准从这个意义上说,使用Empty;不使用null。)您可以构造一个null但不为空的shared_ptr,但它不是很有用。空但不为空的shared_ptr本质上是一个没有所有权的指针,可以用来做一些奇怪的事情,例如passing a pointer to something allocated on the stack to a function expecting a shared_ptr (但我建议您先打孔谁先将shared_ptr放到API内)。
boost::shared_ptr也称为has this constructor,它们称为别名构造函数。

10-01 17:03