2016-12-21 2 views

ответ

4

Если бы это тривиально по умолчанию построимых, то в следующем заявлении:

std::optional<int> o; 

engaged флаг (или эквивалент внутреннего представления) будет неинициализированным (1).

Правда, пользователь может использовать правильную инициализацию:

std::optional<int> o{}; 

Но точку инкапсуляции не создать свой класс таким образом, что независимо от того, какого правового кода кто-то пишет с классом, объект этот класс будет всегда находиться в правильном состоянии (2). То есть вам нужно гарантировать, что независимо от того, как манипулирует ваш объект, он никогда не «сломается».


(1) за исключением, если это глобальный/статический, в этом случае внутреннее представление занимались бы нулевой инициализируется (благодаря Nicol Bolas для указания его)

(2) Обратите внимание, что здесь по допустимому состоянию я имею в виду состояние, в котором все значения элементов данных имеют смысл (они удовлетворяют инвариантам класса). Например, внутренний размер вектора правильно отражает количество удерживаемых объектов, соответствующий флаг корректно отражает, если необязательный трюм или нет базовый объект и т. Д.

+1

Если 'o' не были статическими/thread_local, в этом случае внутренний представление «задействовано» было бы нулевой инициализацией. –

+0

@NicolBolas true, добавлено – bolov

Смежные вопросы