std :: is_trivially_copyableは間違っていますか?

電話

cppreferenceと現在のc ++作業ドラフトを考慮すると、次の場合、クラスは簡単にコピーできます。

  1. すべてのコピーコンストラクターは簡単であるか削除されています
  2. すべての移動コンストラクターは簡単であるか削除されています
  3. すべてのコピー代入演算子は簡単であるか削除されています
  4. すべてのムーブ代入演算子は簡単であるか削除されています
  5. 少なくとも1つのコピーコンストラクター、ムーブコンストラクター、コピー代入演算子、またはムーブ代入演算子が削除されていません
  6. 些細な削除されていないデストラクタ

だから私はこのコードサンプルを思いついた:

#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]

編集
0

コメントを追加

0

関連記事

分類Dev

「is_trivially_copyable」は「std」のメンバーではありません

分類Dev

std :: vectorがis_trivially_copyableだけでなく、ビット単位の移動にis_trivialを必要とするのはなぜですか?

分類Dev

__is_trivially_copyableはg ++ stl内でどのように実装されていますか?

分類Dev

`std :: sin`は最後のビットで間違っています

分類Dev

std :: vectorの最初の要素の値が間違っています

分類Dev

`std :: string str(nullptr)`と `std :: string str = nullptr`が間違っているのはなぜですか?誰かが理由を詳細に説明できますか?

分類Dev

std :: copyableがstd :: movableを包含しているのはなぜですか?

分類Dev

std :: includeのバグですか、それとも何か間違ったことをしていますか?

分類Dev

Why does std::atomic<std::string> give trivially copyable error?

分類Dev

std :: is_trivially_copyable-揮発性スカラー型が自明にコピーできないのはなぜですか?

分類Dev

Valgrindを使用したlongdoubleのstd :: fpclassifyの結果が間違っています

分類Dev

std::fstream::tellg() はファイル カーソル ポインターを間違って出力しますか?

分類Dev

std :: ostringstreamは間違った場所にサインを入れますか?

分類Dev

std :: mapは間違った要素を消去します

分類Dev

C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

分類Dev

std :: thread関数によって渡された間違ったデータを表示しています。

分類Dev

Visual C ++とgccの間でstd :: isblankからの一貫性のない戻り値。どちらが間違っていますか?

分類Dev

間違った入力の後にstd :: cin.clear()を設定してstd :: cinを使用できないのはなぜですか?

分類Dev

const関数を介してstd :: vector要素のアドレスを返すのが間違っているのはなぜですか?

分類Dev

std :: bit_castとstd :: start_lifetime_asの間に有用な違いはありますか?

分類Dev

整数配列で、stoulを使用したstd :: stringの出力が間違っています

分類Dev

Pandas pd.Series()。var()関数は、stdを手動で計算する場合と比較して、異なる出力を提供します。ここで何が間違っているのか考えてみてください。

分類Dev

std :: arrayとstd :: vectorの違いは何ですか?いつ使用しますか?

分類Dev

標準コンテナでstd :: auto_ptr <>を使用するのはなぜ間違っているのですか?

分類Dev

標準コンテナでstd :: auto_ptr <>を使用するのはなぜ間違っているのですか?

分類Dev

Windowsでstd :: stringへのファイルの読み取りの長さが間違っているのはなぜですか?

分類Dev

std :: get_time:間違った結果を使用してtime-stringをstd :: time_tに変換します

分類Dev

std :: pow、std :: logなどのcmath関数について標準は何と言っていますか?

分類Dev

std :: tupleとstd :: tuple <std :: tuple>は、std :: vectorによって同じタイプと見なされますか?

Related 関連記事

  1. 1

    「is_trivially_copyable」は「std」のメンバーではありません

  2. 2

    std :: vectorがis_trivially_copyableだけでなく、ビット単位の移動にis_trivialを必要とするのはなぜですか?

  3. 3

    __is_trivially_copyableはg ++ stl内でどのように実装されていますか?

  4. 4

    `std :: sin`は最後のビットで間違っています

  5. 5

    std :: vectorの最初の要素の値が間違っています

  6. 6

    `std :: string str(nullptr)`と `std :: string str = nullptr`が間違っているのはなぜですか?誰かが理由を詳細に説明できますか?

  7. 7

    std :: copyableがstd :: movableを包含しているのはなぜですか?

  8. 8

    std :: includeのバグですか、それとも何か間違ったことをしていますか?

  9. 9

    Why does std::atomic<std::string> give trivially copyable error?

  10. 10

    std :: is_trivially_copyable-揮発性スカラー型が自明にコピーできないのはなぜですか?

  11. 11

    Valgrindを使用したlongdoubleのstd :: fpclassifyの結果が間違っています

  12. 12

    std::fstream::tellg() はファイル カーソル ポインターを間違って出力しますか?

  13. 13

    std :: ostringstreamは間違った場所にサインを入れますか?

  14. 14

    std :: mapは間違った要素を消去します

  15. 15

    C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

  16. 16

    std :: thread関数によって渡された間違ったデータを表示しています。

  17. 17

    Visual C ++とgccの間でstd :: isblankからの一貫性のない戻り値。どちらが間違っていますか?

  18. 18

    間違った入力の後にstd :: cin.clear()を設定してstd :: cinを使用できないのはなぜですか?

  19. 19

    const関数を介してstd :: vector要素のアドレスを返すのが間違っているのはなぜですか?

  20. 20

    std :: bit_castとstd :: start_lifetime_asの間に有用な違いはありますか?

  21. 21

    整数配列で、stoulを使用したstd :: stringの出力が間違っています

  22. 22

    Pandas pd.Series()。var()関数は、stdを手動で計算する場合と比較して、異なる出力を提供します。ここで何が間違っているのか考えてみてください。

  23. 23

    std :: arrayとstd :: vectorの違いは何ですか?いつ使用しますか?

  24. 24

    標準コンテナでstd :: auto_ptr <>を使用するのはなぜ間違っているのですか?

  25. 25

    標準コンテナでstd :: auto_ptr <>を使用するのはなぜ間違っているのですか?

  26. 26

    Windowsでstd :: stringへのファイルの読み取りの長さが間違っているのはなぜですか?

  27. 27

    std :: get_time:間違った結果を使用してtime-stringをstd :: time_tに変換します

  28. 28

    std :: pow、std :: logなどのcmath関数について標準は何と言っていますか?

  29. 29

    std :: tupleとstd :: tuple <std :: tuple>は、std :: vectorによって同じタイプと見なされますか?

ホットタグ

アーカイブ