Allow Variant to be trivial
Although vtkm::internal::Variant
respected the trivially copyable
attribute of the types it contains, it was never totally trivial (i.e.
std::is_trivial<Variant<...>>
was never true). The reason was that
Variant
was initializing its Index
parameter to signify that it was
not initialized. However, the fact that Index
was initialized meant
that it was not trivially constructed.
Now, Variant
type checks its types to see if they are all trivially
constructible. If so, it makes itself trivially constructible.
This means that Index
may or may not be valid if Variant
is
constructed without an argument. This in turn means that the result of
Variant::IsValid
becomes undefined. That should be OK in practice.
Index
will "point" to an uninitialized object, but that object is
trivially constructed anyway. However, that could cause problems if
developers used IsValid
to determine if something is selected.