Coincidentally, "trivial copyability of std::optional" just popped up over on the SG14 list as well:
The fundamental problem (IMO) is that if you make optional<T> trivially copyable, then you have
optional<int> a = 42; // correctly constructs an `int` and begins its lifetime
optional<int> b = a; // trivially copies some bits into the memory address of `b`
In the `b` case, there is no `int` object actually constructed (assuming the common implementation of `optional<T>` as containing a union of a dummy char and a `T` object, where the `T` object is not constructed by default). So the first access to `b.value()` invokes undefined behavior, as far as I'm aware.
I believe that this problem (A) does not cause incorrect codegen in practice because compilers don't optimize on lifetime information yet; and (B) is actively being tackled by papers such as Ville & Richard's P0593r1 so that such optimizations might be implementable in the future.
If P0593r1 is adopted in its current form, then optional<T> will be able to be trivially_copyable whenever T is trivially_copyable; however, there will be cases where the trivialness of the copy constructor cannot be propagated because of a non-trivial destructor, or vice versa.
–Arthur