cppreferenceと現在のc ++作業ドラフトを考慮すると、次の場合、クラスは簡単にコピーできます。
些細な削除されていないデストラクタ
だから私はこのコードサンプルを思いついた:
#include <type_traits>
struct non_trivially_copyable {
non_trivially_copyable(non_trivially_copyable const&) = delete;
non_trivially_copyable& operator=(non_trivially_copyable const&) = delete;
non_trivially_copyable(non_trivially_copyable &&) = delete;
non_trivially_copyable& operator=(non_trivially_copyable &&) = delete;
};
int main()
{
return std::is_trivially_copyable<non_trivially_copyable>::value;
}
私のクラスは要件番号5を満たしていません。それでも、私のクラスnon_trivially_copyable
は簡単にコピーできるという結果が得られます。私はいくつかのオンラインコンパイラでそれをテストしました:
すべての実装が間違っているとは思えません。では、なぜこの結果が得られるのですか?
これはC ++ 17で変更されました。その前は、non_trivially_copyable
簡単にコピーできたでしょう。あなたが自分で参照している標準の一部によって、あなたのクラスは確かにC ++ 17で簡単にコピーすることはできません。
ただし、libstdc ++とlibc ++はまだそれを反映するように更新されていないようです。したがって、あなたの質問に直接答えるには、これら2つの実装は確かに間違っています。godboltリンクは、MSVCがそれを正しく行うことを示していることに注意してください。
これは欠陥と見なされていたため(CWG 1734を参照)、C ++の古いリビジョンの実装でも変更されるはずです。
私の知る限り、標準の変更の主な動機の1つは、memcpy
アトミックとミューテックスの周りを違法にすることでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加