この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);)。
もっと簡単に言えば、explicitmoveまたはcopyコンストラクターは期待に反し、ジェネリックコードと同様に使用することはできません。
MoveConstructible要件を課す標準ライブラリの他のいくつかの部分:
unique_ptr<T, D>bind(渡されるすべての減衰型が関係します)thread、、(すべてコールラッパーで指定async)call_oncesort、、、、stable_sort_ nth_element_sort_heapこのキーワードは、予期しない場所での予期しない変換を回避するために、explicit(単一引数の)コンストラクターの変換に推奨されます。
コピーコンストラクターと移動コンストラクターは、その意味で「驚くべき」ことはほとんどありません。それらは主に予想される場所で発生します。それらが必要ない場合は、=delete明示的にするのではなく、マークを付けることを期待します。
おそらく、ほとんどの用途で暗黙の移動コンストラクターが必要です。これらは通常、コピーコンストラクターと同じカテゴリに分類されます。Explicitは、すべての1引数コンストラクターに推奨されるわけではありませんが、ほとんどの場合に推奨されます。移動コンストラクターはそのリストにありません。
実際の問題は、明示的な移動コンストラクターをどのように使用できるかということです。右辺値で呼び出すことはできないため、コンパイラーは、使用可能な場合は常にコピーコンストラクターを選択する必要があります。そうしないと、コンパイルに失敗します。
編集:ここに例へのリンクがあります:http ://www.ideone.com/nm7KM
関数から値で返す場合、暗黙の移動コンストラクターは通常、プロセスをより効率的にすることができます。