В соответствии со стандартом, 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
не может быть конструктивным?