`std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

楽しい

次のサンプルは、行をContainer container2(container1);削除しても正しくビルドおよび実行されます。それstd::variant自体Containerのコピーコンストラクターが削除されているようです。これにより、私のコピーコンストラクターが暗黙的に削除されます。

事実上、私は尋ねています:

  1. std::variantメンバーとしてを保存する適切な方法は何ですか?
  2. Container安全なコピー/ムーブ代入を許可する前に、何を実装する必要がありますか?
#include <string>
#include <variant>

class A {};

class Container {
 public:
  Container(int i) : data_(i) {}
  Container(float f) : data_(f) {}
  Container(std::string s) : data_(s) {}
  Container(std::unique_ptr<A> a) : data_(std::move(a)) {}
  std::variant<int, float, std::string, std::unique_ptr<A>> data_;
};

int main() {
  Container container1{3};
  
  // error: call to implicitly-deleted copy constructor of 'Container'
  // 
  // copy constructor of 'Container' is implicitly deleted because
  // field 'data_' has a deleted copy constructor
  Container container2(container1);

  return 0;
}
ポールサンダース

cppreferenceには、std::variantのコピーコンストラクターについて次ように書かれています。

コンストラクターをコピーします。[...]このコンストラクターはstd::is_copy_constructible_v<T_i>、のすべてT_i当てはまらない限り、削除済みとして定義されTypesます。[...]

言い換えれば、それがされていないということなタイプの一つ以上の場合を除き、削除std::variant含めることができますが、何らかの理由でコピーできません。あなたの場合、それstd::unique_ptrが問題の原因です。おそらくstd::shared_ptrもっと適切でしょう。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

`std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

分類Dev

コピーコンストラクタを持たないオブジェクトでstd :: sortを使用するにはどうすればよいですか?

分類Dev

コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

分類Dev

std :: forwardを使用せずにメンバー変数のmoveコンストラクターを呼び出すにはどうすればよいですか?

分類Dev

std :: Variantを指定してテンプレートパラメータパックを取得するにはどうすればよいですか?

分類Dev

std :: arrayクラスのメンバーを静的にアサートしてc ++ 11でソートするにはどうすればよいですか?

分類Dev

std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

分類Dev

保護されたコンストラクターまたはプライベートコンストラクターのみを持つクラスで:: std :: make_sharedを呼び出すにはどうすればよいですか?

分類Dev

メンバー関数をstd :: functionにバインドするにはどうすればよいですか?

分類Dev

std :: shared_ptrをクラスメンバーとして使用するにはどうすればよいですか?

分類Dev

stdライブラリを使用せずに、コンストラクターでクラスメンバー配列に配列値を割り当てるにはどうすればよいですか?

分類Dev

#![no_std]を使用する場合、コピーを取得するにはどうすればよいですか?

分類Dev

C ++でstd :: functionを使用してFunctorのメンバー関数にアクセスするにはどうすればよいですか?

分類Dev

コピーせずにstd :: stringを使用するにはどうすればよいですか?

分類Dev

std :: unique_ptrのカスタム削除を安全にオーバーロードするにはどうすればよいですか?

分類Dev

可変個引数テンプレートを使用してstd :: variantをstd :: visitで続行するにはどうすればよいですか?

分類Dev

ConstCharパラメータにstd :: stringを使用するにはどうすればよいですか

分類Dev

VisualStudioでクラスをstd :: arrayやstd :: vectorのようにデバッグしやすいものにするにはどうすればよいですか?

分類Dev

std :: functionを使用して、クラスのインスタンスを作成せずにメンバー関数を使用するにはどうすればよいですか?

分類Dev

Ubuntuにmingw-std-threadsをインストールするにはどうすればよいですか?

分類Dev

std::variant を 1 つの値に減らすにはどうすればよいですか?

分類Dev

#![no_std]でクレートをテストするにはどうすればよいですか?

分類Dev

std :: variantのoperator <<を書くにはどうすればよいですか?

分類Dev

std :: Variantクラスメンバーのすべての型のコンストラクターを作成しないようにする方法はありますか?

分類Dev

スーパークラスとサブクラスの両方でstd :: enable_shared_from_thisを使用するにはどうすればよいですか?

分類Dev

`std :: vector`メンバー変数をメソッドの呼び出し元に移動するにはどうすればよいですか?

分類Dev

テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

分類Dev

ブランチレスstd :: vectorスキャンを作成するにはどうすればよいですか?

分類Dev

std :: vector <>からインデックスで要素を消去するにはどうすればよいですか?

Related 関連記事

  1. 1

    `std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

  2. 2

    コピーコンストラクタを持たないオブジェクトでstd :: sortを使用するにはどうすればよいですか?

  3. 3

    コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

  4. 4

    std :: forwardを使用せずにメンバー変数のmoveコンストラクターを呼び出すにはどうすればよいですか?

  5. 5

    std :: Variantを指定してテンプレートパラメータパックを取得するにはどうすればよいですか?

  6. 6

    std :: arrayクラスのメンバーを静的にアサートしてc ++ 11でソートするにはどうすればよいですか?

  7. 7

    std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

  8. 8

    保護されたコンストラクターまたはプライベートコンストラクターのみを持つクラスで:: std :: make_sharedを呼び出すにはどうすればよいですか?

  9. 9

    メンバー関数をstd :: functionにバインドするにはどうすればよいですか?

  10. 10

    std :: shared_ptrをクラスメンバーとして使用するにはどうすればよいですか?

  11. 11

    stdライブラリを使用せずに、コンストラクターでクラスメンバー配列に配列値を割り当てるにはどうすればよいですか?

  12. 12

    #![no_std]を使用する場合、コピーを取得するにはどうすればよいですか?

  13. 13

    C ++でstd :: functionを使用してFunctorのメンバー関数にアクセスするにはどうすればよいですか?

  14. 14

    コピーせずにstd :: stringを使用するにはどうすればよいですか?

  15. 15

    std :: unique_ptrのカスタム削除を安全にオーバーロードするにはどうすればよいですか?

  16. 16

    可変個引数テンプレートを使用してstd :: variantをstd :: visitで続行するにはどうすればよいですか?

  17. 17

    ConstCharパラメータにstd :: stringを使用するにはどうすればよいですか

  18. 18

    VisualStudioでクラスをstd :: arrayやstd :: vectorのようにデバッグしやすいものにするにはどうすればよいですか?

  19. 19

    std :: functionを使用して、クラスのインスタンスを作成せずにメンバー関数を使用するにはどうすればよいですか?

  20. 20

    Ubuntuにmingw-std-threadsをインストールするにはどうすればよいですか?

  21. 21

    std::variant を 1 つの値に減らすにはどうすればよいですか?

  22. 22

    #![no_std]でクレートをテストするにはどうすればよいですか?

  23. 23

    std :: variantのoperator <<を書くにはどうすればよいですか?

  24. 24

    std :: Variantクラスメンバーのすべての型のコンストラクターを作成しないようにする方法はありますか?

  25. 25

    スーパークラスとサブクラスの両方でstd :: enable_shared_from_thisを使用するにはどうすればよいですか?

  26. 26

    `std :: vector`メンバー変数をメソッドの呼び出し元に移動するにはどうすればよいですか?

  27. 27

    テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

  28. 28

    ブランチレスstd :: vectorスキャンを作成するにはどうすればよいですか?

  29. 29

    std :: vector <>からインデックスで要素を消去するにはどうすればよいですか?

ホットタグ

アーカイブ