Объекты типа<optional<T>>предназначены для использования в местах, где объекты типа<T>могут быть неинициализированы. Поэтому, Цель<optional<T>>— формализовать дополнительное, возможно, неинициализированное состояние. С точки зрения этой роли<optional<T>>может иметь ту же оперативную семантику<T>плюс дополнительную семантику, соответствующую этому особому состоянию. Таким образом,<optional<T>>можно рассматривать каксупертипиз<T>. Конечно, мы не можем сделать это в C++, поэтому нам нужно составить желаемую семантику, используя другой механизм. Сделать это наоборот, то есть сделать<optional<T>>подтипом<T>не только концептуально неправильно, но и непрактично: не допускается вывод из неклассового типа, такого как встроенный тип.
Мы можем извлечь из цели<optional<T>>необходимую базовую семантику:
Строительство по умолчанию:Ввести формально неинициализированный обернутый объект.
Конструкция прямой стоимости с помощью копии:Ввести формально инициализированный обернутый объект, значение которого получается в виде копии какого-либо объекта.
Глубокое копирование конструкции:Получить новый, но эквивалентный обернутый объект.
Назначение прямой стоимости (при инициализации):Присвоить значение обернутому объекту.
Назначение прямого значения (при неинициализированном):Для инициализации обернутого объекта со значением, полученным в виде копии какого-либо объекта.
Назначение (при инициализации):Присвоить обернутому объекту значение другого обернутого объекта.
Назначение (на неинициализированный):Для инициализации обернутого объекта со значением другого обернутого объекта.
Глубокие реляционные операции (при поддержке типа Т):Сравнить обернутые значения объектов с учетом наличия неинициализированных состояний.
Доступ к стоимости:Чтобы раскрутить завернутый объект.
Запрос состояния инициализации:Определить, является ли объект официально инициализированным или нет.
Своп:Обменять завернутые предметы. (за исключением гарантий безопасности, предоставляемых<T>своп).
Деинициализация:Выпустить обернутый объект (если таковой имеется) и оставить обертку в неинициализированном состоянии.
Полезны дополнительные операции, такие как преобразование конструкторов и преобразование заданий, строительство и назначение на месте и безопасный доступ к стоимости через указатель на обернутый объект или нуль.
Статья The semantics раздела Boost.Optional Design Overview может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.