私の間違いだったか、私は誤って引用されていました。私は正直言ってそれを思い出しません。 is_trivial
もis_trivially_copyable
を使用しないでください
:
はしかし、私は、件名に、この非常に強く開催されたアドバイスを持っています! EVER !!!
代わりにこれらのいずれかを使用します。
is_trivially_destructible<T>
is_trivially_default_constructible<T>
is_trivially_copy_constructible<T>
is_trivially_copy_assignable<T>
is_trivially_move_constructible<T>
is_trivially_move_assignable<T>
は理論的根拠:
tldr:このexcellent question and correct answer.
(私を含め)誰がis_trivial
とis_trivially_copyable
の定義を思い出すことができます参照してください。 。もしあなたがそれを見上げて、それを分析するのに10分を費やしたら、それはあなたが直感的に思っていることをするかもしれないし、しないかもしれません。それを正しく分析できれば、CWGはほとんどまたはまったくその定義を変更してコードを無効にすることができます。
is_trivial
とis_trivially_copyable
を使用しています。
しかしこれら:
is_trivially_destructible<T>
is_trivially_default_constructible<T>
is_trivially_copy_constructible<T>
is_trivially_copy_assignable<T>
is_trivially_move_constructible<T>
is_trivially_move_assignable<T>
彼らがやるような音、そしてこれまで彼らの定義が変更されている可能性はありません、正確に何をすべきか。特別なメンバーのそれぞれと個別に対処しなければならないことはあまりにも冗長に思えるかもしれません。しかし、それはあなたのコードの安定性/信頼性において恩恵を受けるでしょう。そしてもしあなたがそうしなければならないならば、これらの個々の形質をカスタム形質にまとめる。
更新
例えば、打ち鳴らす& gccが、このプログラムのコンパイル:
#include <type_traits>
template <class T>
void
test()
{
using namespace std;
static_assert(!is_trivial<T>{}, "");
static_assert(is_trivially_copyable<T>{}, "");
static_assert(is_trivially_destructible<T>{}, "");
static_assert(is_destructible<T>{}, "");
static_assert(!is_trivially_default_constructible<T>{}, "");
static_assert(!is_trivially_copy_constructible<T>{}, "");
static_assert(is_trivially_copy_assignable<T>{}, "");
static_assert(!is_trivially_move_constructible<T>{}, "");
static_assert(is_trivially_move_assignable<T>{}, "");
}
struct X
{
X(const X&) = delete;
};
int
main()
{
test<X>();
}
注X
が自明コピー可能ですが、はないは自明構築可能コピーすることを。私の知る限りでは、これは適合する行動です。
現在、VS-2015はX
がであると言います。もほとんどコピー可能ではありません。私はこれが現在の仕様によれば間違っていると信じていますが、私の常識が教えてくれるものと確かに一致します。
私はmemcpy
に初期化されていないメモリに必要であれば、私はそのような操作は大丈夫だろうと、私を保証するためにis_trivially_copyable
上is_trivially_copy_constructible
を信頼します。 memcpy
からに初期化されたのメモリを使用したい場合は、is_trivially_copy_assignable
をチェックします。
これはちょうどハワードが、おそらくそれを考えずに、議論の中で言ったものですか? – SergeyA
'std :: mutex'は簡単にコピー可能ですか?これらのコンストラクタをコピーする標準とコピーの代入はともに 'delete'とマークされます。 – NathanOliver
@ NathanOliverそれはLWG 1734の要点です(あなたが正しいとはいえ、 'mutex'は自明にコピーできません。) – Columbo