このexplicit
キーワードは、コピーコンストラクターを除き、1つの引数で呼び出すことができるほとんどすべて のコンストラクターに推奨されます。
コピーコンストラクターの場合、これには用途があります(関数呼び出し、returnなどによる暗黙的なコピーを禁止するため)が、通常必要なものではありません。
移動コンストラクターはどうですか?それらを明示的にするための合理的なユースケースはありますか?ここでの良い習慣は何ですか?
このexplicit
キーワードは、コピーコンストラクターを除き、1つの引数で呼び出すことができるほとんどすべて のコンストラクターに推奨されます。
コピーコンストラクターの場合、これには用途があります(関数呼び出し、returnなどによる暗黙的なコピーを禁止するため)が、通常必要なものではありません。
移動コンストラクターはどうですか?それらを明示的にするための合理的なユースケースはありますか?ここでの良い習慣は何ですか?
移動コンストラクターは、標準アルゴリズムなどとのexplicit
互換性に影響を与える可能性があります。たとえば、MoveConstructibleであるstd::swap<T>
必要があります。T
次に、MoveConstructibleは、式の観点から指定されます。つまり、T u = rv;
(rv
はタイプの右辺値ですT
)。
特定の型に非明示的コピーコンストラクターも非明示的移動コンストラクターも存在しない場合T u = rv;
は無効であり、その型はで使用できませんstd::swap
。(ただし、この特定の例ではstd::swap
、たとえばを使用して、目的の機能を提供するように特化することができますT u(rv);
)。
もっと簡単に言えば、explicit
moveまたはcopyコンストラクターは期待に反し、ジェネリックコードと同様に使用することはできません。
MoveConstructible要件を課す標準ライブラリの他のいくつかの部分:
unique_ptr<T, D>
bind
(渡されるすべての減衰型が関係します)thread
、、(すべてコールラッパーで指定async
)call_once
sort
、、、、stable_sort
_ nth_element
_sort_heap
このキーワードは、予期しない場所での予期しない変換を回避するために、explicit
(単一引数の)コンストラクターの変換に推奨されます。
コピーコンストラクターと移動コンストラクターは、その意味で「驚くべき」ことはほとんどありません。それらは主に予想される場所で発生します。それらが必要ない場合は、=delete
明示的にするのではなく、マークを付けることを期待します。
おそらく、ほとんどの用途で暗黙の移動コンストラクターが必要です。これらは通常、コピーコンストラクターと同じカテゴリに分類されます。Explicitは、すべての1引数コンストラクターに推奨されるわけではありませんが、ほとんどの場合に推奨されます。移動コンストラクターはそのリストにありません。
実際の問題は、明示的な移動コンストラクターをどのように使用できるかということです。右辺値で呼び出すことはできないため、コンパイラーは、使用可能な場合は常にコピーコンストラクターを選択する必要があります。そうしないと、コンパイルに失敗します。
編集:ここに例へのリンクがあります:http ://www.ideone.com/nm7KM
関数から値で返す場合、暗黙の移動コンストラクターは通常、プロセスをより効率的にすることができます。