4

以下是两个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);
}

Q1:为什么顶部的复制构造函数甚至在那里?看起来底部的一个占每个案例(包括顶部的一个)。它甚至被调用吗?如果他们不包括它,底部的会取而代之吗?

Q2:底部(模板化)构造函数的第二个参数发生了什么。我想我了解 SFINAE 方面,但我不明白为什么后面有一个额外的 *::type

4

2 回答 2

5

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

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

于 2011-08-12T00:04:10.053 回答
4

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

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

干杯&hth.,

于 2011-08-12T00:06:27.620 回答