В соответствии со стандартом, copy-constructor std::optional<T>:
... должен быть определен как удаленный, если
is_copy_constructible_v<T>не равенtrue.
Но конструктор move std::optional<T>:
... не участвует в разрешении перегрузки, если
is_move_constructible_v<T>не являетсяtrue.
Как я понимать удаленные конструкторы, целью не-удаления конструктора move std::optional<T> было бы разрешить такой код:
std::optional<X> o1;
std::optional<X> o2(std::move(o1));
... чтобы работать, опираясь на некоторую последовательность преобразований - o2 будет построен объектом типа A, который был построен с использованием std::optional<X>&& (исправьте меня, если я ошибаюсь).
Но о возможных конструкторах std::optional, я с трудом разбираюсь в том, что может соответствовать этому варианту использования...
Почему конструктор move std::optional<T> просто не удаляется, если T не может быть конструктивным?