web-dev-qa-db-ja.com

技術的な観点から、Shared_from_thisをコンストラクタで使用できないのはなぜですか?

The C++ Standard Library で91ページshared_from_this()についてこれを読みました:

問題は、shared_ptrPersonの基本クラスenable_shared_from_this<>at the endのPersonの構成のプライベートメンバーに自分自身を格納することです。

本の関連コードスニペットは次のとおりです。

class Person : public std::enable_shared_from_this<Person> {
   ...
};

ここでは2つのことを理解できません。

  1. このshared_ptrは誰ですか?
  2. Personの構築の終わりに、彼はどのようにして自分自身をどこに格納できますか? Personの構築は、私が作成したコンストラクターの最後のステートメントで終わると思います。

まだ初期化されていないweak_ptrがあることを理解しています。

編集:Angewに感謝! shared_from_thisは、最初のshared_ptrPersonが作成された後にのみ機能します。このshared_ptrは、Personクラスがenable_shared_from_thisから継承されているかどうかを確認し、継承されている場合は内部weak_ptrを初期化します。

33
Yola

理由は簡単です。オブジェクトXで、_enable_shared_from_this_は、オブジェクトXを指す最初の_weak_ptr_のコピーで非表示の_shared_ptr_を初期化することで機能します。ただし、_shared_ptr_がXを指すことができるようにするには、Xがすでに存在している必要があります(すでに構築されている必要があります)。したがって、Xのコンストラクターの実行中は、_shared_ptr_が使用できる_enable_shared_from_this_はまだありません。

次のコードを見てください。

_std::shared_ptr<Person> p(new Person());
_

p(_shared_ptr_の)のコンストラクタが呼び出される前に、その引数を評価する必要があります。その引数は、式new Person()です。したがって、Personのコンストラクターは、pのコンストラクターが始まる前、つまり_shared_ptr_がバインドできる_enable_shared_from_this_オブジェクトがなくなる前に実行されます。

39
Angew