7

std::is_trivially_copyableこれら 2 つのコンパイラのいずれでもまだサポートされていません (少なくとも gcc 4.6 まで)。しかし、どちら__has_trivial_copyもかなり良い仕事をするディレクティブを提供します。削除されたコピー コンストラクターの場合を除きます。

struct A { A(A const&) =delete; };

__has_trivial_copy(A)clang では 1、gcc では 0 を返します。

私は標準を掘り下げていましたが、コピーコンストラクターが削除されたときに、クラスがまだ自明にコピー可能であると見なされるかどうかを示す句を見つけることができませんでした。

誰が正しいですか?

私の傾向としては、gcc が正しいと信じる傾向がありstruct Aます。また、削除されたコピー コンストラクターは非公開で宣言されているが、定義されていないコンストラクターと見なすことができるという幅広いコンセンサスがあります。その場合、gcc は依然として正しいでしょう。

一方、セクション 9/6 の標準では、重要な操作がないという点で自明なコピー可能性について説明しています。標準をそのまま読めば、clang が正しいのかもしれません。

4

2 に答える 2

5

clangのネイティブライブラリであるlibc++は、std::is_trivially_copyable<T>明らかに自明にコピー可能ではありませんが、型が自明にコピー可能であるとあなたの例をサポートし、実際にそのふりをします。12.8 [class.copy]段落12は、削除されたコンストラクターを自明ではないと定義していると思います。

クラスXのコピー/移動コンストラクターは、ユーザーが提供しない場合は簡単です...

削除された宣言は明らかにユーザー提供です。ここで「明確に」と言うときは、関数を削除済みとして宣言することはユーザー提供としてカウントされるという標準では、すぐにバックアップできないことを意味します...

さらなる調査により、8.4.2 [dcl.fct.def.default]段落4(参照を提供してくれたJesse Goodに感謝)により、削除された関数がユーザー提供ではないことが明らかになりました。

...特別なメンバー関数は、ユーザーが宣言し、最初の宣言で明示的にデフォルト化または削除されていない場合、ユーザーが提供します。..。

したがって、コピーコンストラクターが削除されたクラスは、自明ではないコピー可能にする他の理由がない場合、実際に自明にコピー可能です(ただしA、質問の型には適用されません。少し奇妙です。型タイプは、コンストラクターをコピーしますが、 !を使用してコピーできstd::memcpy()ます。これが本当に意図的なものかどうかはわかりません。

于 2012-10-05T22:52:16.080 に答える
1

どちらも拡張機能を使用しているため、どちらも正しくも正しくもありません。

警告: この回答は、C++11 ドラフト N3242 に含まれていた単語に基づいていましたが、最終的な標準には含まれていません。だから特にいいわけではない。比較と議論のためにそれを残します。

あなたが尋ねるつもりだったようです:(std::is_trivially_copyable<A>::valueそしてまたstd::is_trivially_copy_constructible<A>::value)はでなければなりませんfalse

12.8 パラグラフ 13:

クラスのコピー/移動コンストラクターXは、ユーザーが提供したり削除したりしていない場合、自明です....

そして、完全にするために、

9段落6:

自明にコピー可能なクラスとは、次のようなクラスです。

  • 重要なコピー コンストラクターがない (12.8)。
  • 自明でない移動コンストラクターを持たない (12.8)、
  • 重要なコピー代入演算子を持たない (13.5.3, 12.8),
  • 自明でない移動代入演算子がない (13.5.3、12.8)、および
  • 自明なデストラクタがあります (12.4)。

3.9 パラグラフ 9:

スカラー型、自明にコピー可能なクラス型 (条項 9)、そのような型の配列、およびこれらの型の cv 修飾バージョン (3.9.3) は、まとめて自明にコピー可能な型と呼ばれます。

20.9.4.3 表 49:

テンプレート:template <class T> struct is_trivially_copyable;

条件:T単純にコピー可能なタイプ (3.9)

于 2012-10-05T23:00:55.317 に答える