Не удалось std::optional<T>
be trivially default constructible?Тривиальный конструктор по умолчанию для std :: optional
Кажется, единственным препятствием является инициализация флага engaged
, но не инициализация нуля не обрабатывает ситуацию?
Не удалось std::optional<T>
be trivially default constructible?Тривиальный конструктор по умолчанию для std :: optional
Кажется, единственным препятствием является инициализация флага engaged
, но не инициализация нуля не обрабатывает ситуацию?
Если бы это тривиально по умолчанию построимых, то в следующем заявлении:
std::optional<int> o;
engaged
флаг (или эквивалент внутреннего представления) будет неинициализированным (1).
Правда, пользователь может использовать правильную инициализацию:
std::optional<int> o{};
Но точку инкапсуляции не создать свой класс таким образом, что независимо от того, какого правового кода кто-то пишет с классом, объект этот класс будет всегда находиться в правильном состоянии (2). То есть вам нужно гарантировать, что независимо от того, как манипулирует ваш объект, он никогда не «сломается».
(1) за исключением, если это глобальный/статический, в этом случае внутреннее представление занимались бы нулевой инициализируется (благодаря Nicol Bolas для указания его)
(2) Обратите внимание, что здесь по допустимому состоянию я имею в виду состояние, в котором все значения элементов данных имеют смысл (они удовлетворяют инвариантам класса). Например, внутренний размер вектора правильно отражает количество удерживаемых объектов, соответствующий флаг корректно отражает, если необязательный трюм или нет базовый объект и т. Д.
Если 'o' не были статическими/thread_local, в этом случае внутренний представление «задействовано» было бы нулевой инициализацией. –
@NicolBolas true, добавлено – bolov