weak_ptr奇怪的复制构造函数

weak_ptr's weird copy constructors

本文关键字:复制 构造函数 ptr weak      更新时间:2023-10-16

下面是weak_ptr的两个构造函数:http://msdn.microsoft.com/en-us/library/bb982126.aspx

weak_ptr(const weak_ptr&);
template<class Other>
weak_ptr(const weak_ptr<Other>&);

实际代码(来自memory):

weak_ptr(const weak_ptr& _Other)
{   // construct weak_ptr object for resource pointed to by _Other
    this->_Resetw(_Other);
}
template<class _Ty2>
weak_ptr(const weak_ptr<_Ty2>& _Other,
         typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
         void *>::type * = 0)
{   // construct weak_ptr object for resource pointed to by _Other
    this->_Resetw(_Other);
}

问题1:为什么顶部复制构造函数还存在?看起来下面的那个解释了所有的情况(包括上面的)。它会被调用吗?如果他们不包括它,下面的那个会取代它吗?

Q2:底部(模板化)构造函数的第二个参数发生了什么?我想我理解SFINAE方面,但我不明白为什么在::type

之后有一个额外的*

Q1)如果您不编写复制构造函数,编译器将为您生成一个,这可能不是您想要的。模板化的转换构造函数不算数。

Q2) 请记住,shared_ptr<T>T*类似,必须在指针级别检查可转换性。如果T*可以转换为U*,那么您应该能够将一个分配给另一个。想想指向基的指针。对不起,你问的不是这个。最后的实参类型只需要存在,但我们也不想指定实参本身。可以为其提供默认实参的一种构造类型的通用方法是使用指针。简而言之,我们需要让函数依赖于一个可能存在也可能不存在的类型,但实际上不需要用户知道这一点。

Re Q1:一个模板化的构造函数永远不是一个"复制构造函数",即使它成功地进行了复制。如果没有用户定义的"复制构造函数",编译器将根据需要生成一个。

Re Q2:第二个参数,一个默认为0的指针,只是为了有一个地方放enable_if。如果我没记错的话,你可以在Boost文档中找到更多的信息。

干杯,hth。