How can classes with `std::variant` members be copied safely?
cppreference has this to say about std::variant
's copy constructor:
Copy constructor. [...] This constructor is defined as deleted unless
std::is_copy_constructible_v<T_i>
is true for allT_i
inTypes
. [...]
In other words, it is not deleted unless one or more of the types that the std::variant
can contain is not copyable for whatever reason. In your case, it's the std::unique_ptr
that's causing the problem. Perhaps std::shared_ptr
would be more appropriate.
Extending Paul Sanders' answer: what kind of copy do you want?
If it is a shallow copy, use shared_ptr<A>
.
If it is a deep copy, why not have variant<..,A>
? If the reason is that A
is polymorphic, then the real problem is cloning each of the derived classes. You have to create your own mechanism for the cloning and your own copyable smart pointer to use it - as far as I know, there is nothing in the standard library to help you.