以下是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
答案 0 :(得分:5)
Q1)如果您没有编写复制构造函数,编译器将为您生成一个,这可能不是您想要的。模板化转换构造函数不计算在内。
Q2)请记住, [抱歉,这不是你问的。]最后的参数类型只需要存在,但我们也不想指定参数本身。构成一个我们也可以提供默认参数的类型的通用方法是指针。简而言之,我们需要使函数依赖于可能存在或不存在的类型,但实际上并不需要用户知道这一点。shared_ptr<T>
与T*
类似,必须在指针级别检查可转换性。如果T*
可以转换为U*
,那么您应该能够将一个转换为另一个。想想指向基础。
答案 1 :(得分:3)
Re Q1:模板化构造函数永远不是“复制构造函数”,即使它设法复制。如果没有用户定义的“复制构造函数”,则编译器将根据需要生成一个。
Re Q2:第二个参数,一个默认为0的指针,只是为了放置enable_if
。你可以在Boost文档中找到更多相关信息(如果我没记错的话)。
干杯&amp;第h。,