次のサンプルは、行をContainer container2(container1);
削除しても正しくビルドおよび実行されます。それstd::variant
自体Container
のコピーコンストラクターが削除されているようです。これにより、私のコピーコンストラクターが暗黙的に削除されます。
事実上、私は尋ねています:
std::variant
メンバーとしてを保存する適切な方法は何ですか?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]
コメントを追加