28

このexplicitキーワードは、コピーコンストラクターを除き、1つの引数で呼び出すことができるほとんどすべて のコンストラクターに推奨されます。

コピーコンストラクターの場合、これには用途があります(関数呼び出し、returnなどによる暗黙的なコピーを禁止するため)が、通常必要なものではありません。

移動コンストラクターはどうですか?それらを明示的にするための合理的なユースケースはありますか?ここでの良い習慣は何ですか?

4

5 に答える 5

27

移動コンストラクターは、標準アルゴリズムなどとの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、、(すべてコールラッパーで指定asynccall_once
  • sort、、、、stable_sort_ nth_element_sort_heap
于 2011-07-20T08:29:42.267 に答える
5

このキーワードは、予期しない場所での予期しない変換を回避するために、explicit(単一引数の)コンストラクターの変換に推奨されます。

コピーコンストラクターと移動コンストラクターは、その意味で「驚くべき」ことはほとんどありません。それらは主に予想される場所で発生します。それらが必要ない場合は、=delete明示的にするのではなく、マークを付けることを期待します。

于 2011-07-20T12:21:41.213 に答える
5

おそらく、ほとんどの用途で暗黙の移動コンストラクターが必要です。これらは通常、コピーコンストラクターと同じカテゴリに分類されます。Explicitは、すべての1引数コンストラクターに推奨されるわけではありませんが、ほとんどの場合に推奨されます。移動コンストラクターはそのリストにありません。

于 2011-07-20T08:13:06.303 に答える
2

実際の問題は、明示的な移動コンストラクターをどのように使用できるかということです。右辺値で呼び出すことはできないため、コンパイラーは、使用可能な場合は常にコピーコンストラクターを選択する必要があります。そうしないと、コンパイルに失敗します。

編集:ここに例へのリンクがあります:http ://www.ideone.com/nm7KM

于 2011-07-20T17:08:15.537 に答える
0

関数から値で返す場合、暗黙の移動コンストラクターは通常、プロセスをより効率的にすることができます。

于 2012-04-30T16:30:35.723 に答える