Ответ 1
Конструктор копирования задается как:
optional(const optional<T>& rhs);
3 Требуется:is_copy_constructible_v<T>
-true
.
4 Эффекты: Еслиrhs
содержит значение, инициализирует содержащееся значение, как будто direct-non-list-initializing объект типаT
с выражением*rhs
.
5 Постусловие:bool(rhs) == bool(*this)
.
6 Броски: любое исключение, созданное выбранным конструкторомT
.
Ничто здесь не требует, чтобы optional
тривиально можно было копировать, но по правилу as-if ничего здесь не мешает реализации от выбора сделать это. Например, в реализации libstdС++ optional<T>
не является тривиально скопируемым для любого T
.
Единственное явное обсуждение тривиальности состоит в том, что если T
тривиально разрушаемо, то optional<T>
также будет тривиально разрушаемым.