weak_ptr奇怪的复制构造函数
weak_ptr's weird copy constructors
下面是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。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用