タイプが可能であるための十分な条件であると私は理解しますが、この目的のためにも十分ですか?そうでない場合、なぜですか?is_pod
memcpy
has_trivial_destructor
4 に答える
いいえ。要件は、型が自明にコピー可能(§3.9/ 2)であるということです。これには、自明でないコピーコンストラクター(§9/ 6)がないなど、さらにいくつかの要件があります。
自明にコピー可能なクラスは、次のようなクラスです。
—重要なコピーコンストラクター(12.8)はありません。
—自明でない移動コンストラクター(12.8)はありません。
—自明でないコピー代入演算子(13.5.3、12.8)はありません、
—自明でないムーブ代入演算子(13.5.3、12.8)はなく、
—ささいなデストラクタ(12.4)があります。
is_trivially_copyable
したがって、代わりに使用する必要があります。
オブジェクトに些細なデストラクタがあるだけでは不十分です。また、簡単なコピー操作が必要です。オブジェクトは、たとえば、内部バッファへのポインタを維持する場合があります。何かを破棄する必要はありませんが、コピー先のオブジェクトにポインタを設定する必要があります。そうしないと、ソースオブジェクトのバッファを指すためです。
実際には一般的にまれですが、クラスに重要なコピーコンストラクタと重要なデストラクタがある場合があります。クラスがコピーされた回数をカウントするだけの静的メンバー変数を持つクラスについて考えてみます。その場合memcpy
、カウンターは不正確になります。
プレーンポインターを持つクラスはとして適格であるように私には思えhas_trivial_destructor
ますが、通常は深いコピーを作成したいのに対しmemcpy
、浅いコピーを作成します。