移動専用タイプのstd :: list:VC ++のstd :: vectorに配置できません

ダンニッセンバウム

VC ++ 2019では、移動専用タイプのemplace_back(右辺値)listできません

#include <vector>
#include <list>

struct A
{
    A(A&&) {}
};

using ListOfA = std::list<A>;

int main()
{
    std::vector<ListOfA> v;

    // Build error in VC++ 2019
    // No error in Clang and GCC C++11 - C++2a
    v.emplace_back(std::move(ListOfA()));
}

VC ++ 2019でビルドしようとすると、次のコンパイルエラーが発生します。

'A::A(const A &)': attempting to reference a deleted function

明らかに、VC ++はの(左辺値)コピーコンストラクターをインスタンス化しようとしていますAが、のコンストラクターの1つを明示的に定義しているため、(正しく)存在しませんA

クラスから移動listして、インプレースでインプレースをインスタンス化することは有効であると思います。つまりクラスには移動コンストラクターがあり、これにより、newが(の要素の所有権を取得するだけでよいと思います。移動元)、コピーを必要としません。vectorlistlistlistlist

実際、Wandboxを使用すると、 GCCとClangを使用し同じコードがエラーなしでビルドおよび実行されます

このコードがVC ++ 2019でコンパイルされない理由を誰かが説明できますか?誤解がありますか?(左辺値の)コピーコンストラクターが上記のコードでVC ++コンパイラーによってインスタンス化されている正当な理由は実際にありますか?


注意

std::move(...)が存在しない場合、VC ++でも同じエラーが発生します。つまり、次の行でも同じエラーが発生します。

v.emplace_back(ListOfA());

cpplearner

MSVCは、std::listmoveコンストラクターがスローしているため、のコピーコンストラクターを使用します再割り当て中に、moveコンストラクターがスローした場合std::vector、標準で要求されている強力な例外保証を提供できません。

あなたの場合、ベクトルには再割り当ての前に要素がないため、コピーコンストラクターが呼び出されていないように見えますが、それはコピーコンストラクターが必要ないという意味ではありません。

std::listlibstdc ++およびlibc ++にはnoexceptmoveコンストラクターがあります。これは許可されていますが、規格では必須ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

移動専用タイプから派生したクラスでデストラクタを定義すると、std :: vectorのemplace_backまたはpush_backで作成されたときにコンパイル時エラーが発生します

分類Dev

移動専用タイプをクラスに追加すると、そのクラスは移動専用タイプになりますか?

分類Dev

移動専用タイプにstatic_castする場合のClangとGCC

分類Dev

ラムダの移動:移動専用タイプを移動キャプチャした後、ラムダをどのように使用できますか?

分類Dev

std :: listへのイテレータのstd :: setに要素を挿入できません

分類Dev

std :: launder、std :: vector、および移動可能な構成可能なタイプのみ

分類Dev

(std :: vector <std :: vector <std :: string >>)にアイテムを追加できません

分類Dev

イテレータや参照を無効にすることなくstd :: list内の要素を移動できますが、どうすればよいですか?

分類Dev

非同期ラムダのstd :: vector *にアクセスできません

分類Dev

移動専用タイプのベクトルへの挿入

分類Dev

constexpr std :: vectorを作成できません

分類Dev

std :: bindの結果をstd :: functionに変換できません

分類Dev

C ++:エラーをstd :: vector <int> *からstd :: vector <std :: vector <int >>に変換できませんでした

分類Dev

std :: forward_list :: removeとstd :: Erase <std :: forward_list>の値のタイプが異なるのはなぜですか?

分類Dev

演算子 '??' タイプ 'List <double>'のオペランドには適用できません

分類Dev

vc ++はunsignedlonglongの差をdoubleに変換できませんでした

分類Dev

'const'修飾子は 'std :: vector <long unsigned int>&'には適用できません

分類Dev

スワップファイルをSnowLeopardの専用パーティションに移動する

分類Dev

std :: functionメンバーを使用して移動専用タイプからタプルを構築する

分類Dev

std :: vector :: push_back()は、移動コンストラクターが削除されたオブジェクトのMSVCでコンパイルされません

分類Dev

パラメータ1を「std :: _ Vector_iterator <_Myvec>」から「std :: _ Vector_iterator <_Myvec>」に変換できません

分類Dev

ディレクトリの書き込み専用権限では、内部のファイルの名前を変更(移動)できませんか?

分類Dev

std :: lower_boundの戻り値をvector :: iteraterに割り当てることができません

分類Dev

'(std :: vector <std :: vector <int >>)(int、std :: vector <int>)'の呼び出しに一致しません

分類Dev

std :: applyのタプルから完全な転送/移動の構築が機能していません

分類Dev

Rust-タイプの値は `std :: iter :: Iterator <>`から構築できません

分類Dev

'initializer-list'から 'std :: initializer_list <Keyword>&'に変換できません

分類Dev

javaoutタイプマップはポインタのstd :: vectorでは機能しません

分類Dev

共通フィールドを持つさまざまなタイプの構造体にstd :: set_intersectionを適用できません

Related 関連記事

  1. 1

    移動専用タイプから派生したクラスでデストラクタを定義すると、std :: vectorのemplace_backまたはpush_backで作成されたときにコンパイル時エラーが発生します

  2. 2

    移動専用タイプをクラスに追加すると、そのクラスは移動専用タイプになりますか?

  3. 3

    移動専用タイプにstatic_castする場合のClangとGCC

  4. 4

    ラムダの移動:移動専用タイプを移動キャプチャした後、ラムダをどのように使用できますか?

  5. 5

    std :: listへのイテレータのstd :: setに要素を挿入できません

  6. 6

    std :: launder、std :: vector、および移動可能な構成可能なタイプのみ

  7. 7

    (std :: vector <std :: vector <std :: string >>)にアイテムを追加できません

  8. 8

    イテレータや参照を無効にすることなくstd :: list内の要素を移動できますが、どうすればよいですか?

  9. 9

    非同期ラムダのstd :: vector *にアクセスできません

  10. 10

    移動専用タイプのベクトルへの挿入

  11. 11

    constexpr std :: vectorを作成できません

  12. 12

    std :: bindの結果をstd :: functionに変換できません

  13. 13

    C ++:エラーをstd :: vector <int> *からstd :: vector <std :: vector <int >>に変換できませんでした

  14. 14

    std :: forward_list :: removeとstd :: Erase <std :: forward_list>の値のタイプが異なるのはなぜですか?

  15. 15

    演算子 '??' タイプ 'List <double>'のオペランドには適用できません

  16. 16

    vc ++はunsignedlonglongの差をdoubleに変換できませんでした

  17. 17

    'const'修飾子は 'std :: vector <long unsigned int>&'には適用できません

  18. 18

    スワップファイルをSnowLeopardの専用パーティションに移動する

  19. 19

    std :: functionメンバーを使用して移動専用タイプからタプルを構築する

  20. 20

    std :: vector :: push_back()は、移動コンストラクターが削除されたオブジェクトのMSVCでコンパイルされません

  21. 21

    パラメータ1を「std :: _ Vector_iterator <_Myvec>」から「std :: _ Vector_iterator <_Myvec>」に変換できません

  22. 22

    ディレクトリの書き込み専用権限では、内部のファイルの名前を変更(移動)できませんか?

  23. 23

    std :: lower_boundの戻り値をvector :: iteraterに割り当てることができません

  24. 24

    '(std :: vector <std :: vector <int >>)(int、std :: vector <int>)'の呼び出しに一致しません

  25. 25

    std :: applyのタプルから完全な転送/移動の構築が機能していません

  26. 26

    Rust-タイプの値は `std :: iter :: Iterator <>`から構築できません

  27. 27

    'initializer-list'から 'std :: initializer_list <Keyword>&'に変換できません

  28. 28

    javaoutタイプマップはポインタのstd :: vectorでは機能しません

  29. 29

    共通フィールドを持つさまざまなタイプの構造体にstd :: set_intersectionを適用できません

ホットタグ

アーカイブ