C++ 弱ptr';s奇怪的复制构造函数

C++ 弱ptr';s奇怪的复制构造函数,c++,c++11,shared-ptr,weak-ptr,C++,C++11,Shared Ptr,Weak Ptr,以下是2名弱ptr的施工人员: 问题1:为什么顶级复制构造函数会出现?看起来每个案例(包括最上面的一个)都有最下面的一个。有人给它打电话吗?如果他们不包括它,那么底部的那一个会取而代之吗 问题2:底部(模板化)构造函数的第二个参数发生了什么变化。我想我理解SFINAE方面,但我不明白为什么在:typeQ1)之后有一个额外的*。模板转换构造函数不计算在内 问题2)请记住,共享\u ptr就像一个T*,必须在指针级别检查可兑换性。如果T*可转换为U*,则您应该能够将一个分配给另一个。想想指向底部的

以下是2名弱ptr的施工人员:

问题1:为什么顶级复制构造函数会出现?看起来每个案例(包括最上面的一个)都有最下面的一个。有人给它打电话吗?如果他们不包括它,那么底部的那一个会取而代之吗

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

Q1)之后有一个额外的*。模板转换构造函数不计算在内


问题2)请记住,共享\u ptr就像一个
T*
,必须在指针级别检查可兑换性。如果
T*
可转换为
U*
,则您应该能够将一个分配给另一个。想想指向底部的指针。[很抱歉,这不是您要求的。]最终参数类型只需要存在,但我们也不希望必须指定参数本身。构造类型的一种通用方法是指针,我们还可以为该类型提供默认参数。简而言之,我们需要使函数依赖于一种可能存在也可能不存在的类型,但实际上不需要用户知道这一点。

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

Re Q2:第二个参数是一个默认为0的指针,它只是在的情况下放置
enable\u。您可以在Boost文档中找到更多关于这一点的信息(如果我没记错的话)


干杯&hth.,

如果
*
=0
之前不存在,那么它仍然是一个无效的*类型。额外的*不是让它成为一个void**,但在这种情况下,为什么他们不写void**而不是void*?还有,他们为什么不写nullptr而不是0,这是一个错误吗?@Dave:你不必使用
nullptr
,这只是一个可选的新功能。无论如何,我不知道为什么你需要一个双指针事实上,也许这只是他们的房子风格,总是通过指针使用SFINAE,而他们只是碰巧在这种情况下使用
void*
作为内部类型。GCC根本不通过函数参数来实现这一点,而是使用默认模板参数以零运行时成本.LOL触发替换失败。我刚刚写了一个基于_ptr_Base的弱的类似于_ptr的东西,如果我们谈论的第二个
*
不存在,VS说<代码>错误1错误C1001:编译器中发生了内部错误。
因此,这就是它出现的原因。哈。@Dave:很好。谁知道库必须小心翼翼地对待编译器的哪些特性。。。我更担心的是,构造函数的签名与文档中的签名不同@汉斯,那为什么不修正压痕呢?
weak_ptr(const weak_ptr&);

template<class Other>
weak_ptr(const weak_ptr<Other>&);
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);
}