詳細な説明が必要とされている 共有ポインタ
auto sp = std::make_shared<Foo>();
auto sp(std::make_shared<Foo>());
の違いは何であるの構築の違い。
詳細な説明が必要とされている 共有ポインタ
auto sp = std::make_shared<Foo>();
auto sp(std::make_shared<Foo>());
の違いは何であるの構築の違い。
この特定のケースでは、ゼロ差があります。 2つの宣言は完全に同等です。
今(T
とU
は型であると仮定)もう少しコンテキストを追加します。
最も一般的な場合は、このている:この場合
U makeU();
T direct(makeU());
T copy = makeU();
、最初の行は、直接的な初期化です。T
には、U
などを受け入れるコンストラクタが必要です。U
が暗黙的に変換できるものがあります。
2行目は、コピーの初期化でです。コンパイラは概念的にはこれを意味するように書き換える:一時T
一時T
がcopy
に移動(またはコピー)されていることを、次いでU
オブジェクトから初期化され、さ
T copy(T(makeU()))
。つまり、T
にはdirect
と同じコンストラクタと、アクセスできない非明示的なコピーまたは移動コンストラクタが必要です。
T makeT();
T direct(makeT());
T copy = makeT();
、これら二つはほぼ同等である。
Aわずかにより特殊ケースは、U
がT
であるときに起こります。両方とも、コピー/移動コンストラクタを使用して、によって返されたT
の一時的なものからT
と宣言されたものを初期化します。唯一の違いは、そのコピー/移動コンストラクタがexplicit
と宣言されていてもdirect
が機能しますが、copy
はそのような場合にエラーになります。
変数宣言でT
をauto
に置き換えると、元のケースが得られます。 std::shared_ptr
のコピーおよび移動コンストラクタにはexplicit
と表示されていないため、2行は完全に同等です。
std::shared_ptr<T>
にはアクセス可能な非明示的なコピーコンストラクタがありますので、それほど相違はありません。
アセンブリコードを生成すると、両方の例でコンパイラが同じアセンブリを生成することがわかります。
例#1(コピー初期化):
auto sp = std::make_shared<Foo>();
例#2(直接初期化):
auto sp(std::make_shared<Foo>());
それはゼロ差ではありません。 1番目はコンストラクタのみを呼び出します。 2番目のコールコンストラクタ、およびプラス(非明示的なコピーまたは移動コンストラクタ)プラスはゼロではありません。 – pepero
@pepero 'T = U'のとき、純差**は**ゼロです。これは、コピー/移動ctorを2度呼び出すことはありません。 – Angew