weak_ptr的怪异拷贝构造函数

时间:2011-08-12 00:00:14

标签: c++ c++11 shared-ptr weak-ptr

以下是weak_ptr的2个构造函数: 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);
}

Q1:为什么顶级拷贝构造函数就在那里?它看起来像每个案例的底部(包括前一个)。它甚至被调用了吗?如果它们没有包含它,那么底部的它会占据它的位置吗?

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

之后会有额外的*

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

Re Q1:模板化构造函数永远不是“复制构造函数”,即使它设法复制。如果没有用户定义的“复制构造函数”,则编译器将根据需要生成一个。

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

干杯&amp;第h。,