weak_ptr的怪异拷贝构造函数

Dav*_*vid 4 c++ shared-ptr weak-ptr c++11

以下是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>&);
Run Code Online (Sandbox Code Playgroud)

实际代码(来自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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ker*_* SB 5

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

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

  • 大声笑.我刚刚根据_Ptr_Base编写了一个类似于weak_ptr的东西,如果第二个`*`我们正在谈论的不是VS那里说的那样......`错误1错误C1001:编译器中发生内部错误.所以,那是为什么它在那里.哈. (2认同)