4

以下は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:一番下の(テンプレート化された)コンストラクターの2番目の引数はどうなっていますか。SFINAEの側面は理解していると思いますが、なぜ余分な*が後にあるのかわかりません::type

4

2 に答える 2

5

Q1)コピーコンストラクターを作成しない場合、コンパイラーがコピーコンストラクターを生成しますが、これは希望どおりではありません。テンプレート化された変換コンストラクターはカウントされません。

Q2)のように、兌換性はポインタのレベルでチェックする必要があることを忘れないでください。がに変換可能である場合は、一方を他方に割り当てることができるはずです。ベースへのポインタについて考えてみてください。shared_ptr<T>T*T*U*[申し訳ありませんが、それはあなたが尋ねたものではありませんでした。]最後の引数タイプが存在する必要がありますが、引数自体を指定する必要もありません。デフォルトの引数も提供できる型を構成する普遍的な方法は、ポインターです。つまり、関数を存在する場合と存在しない場合があるタイプに依存させる必要がありますが、実際にはユーザーがこれについて知る必要はありません。

于 2011-08-12T00:04:10.053 に答える
4

Q1に関して:テンプレート化されたコンストラクターは、たとえそれがなんとかコピーしたとしても、決して「コピーコンストラクター」ではありません。ユーザー定義の「コピーコンストラクター」がない場合、コンパイラーは必要に応じてそれを生成します。

Q2に関して:2番目の引数(デフォルトは0のポインター)は、を置く場所を用意するためだけのものenable_ifです。それについての詳細は(私が正しく思い出せば)Boostのドキュメントで見つけることができます。

乾杯&hth。、

于 2011-08-12T00:06:27.620 に答える