Почему я не могу использовать nullptr
вместо nullopt
? И почему {}
переводится как nullopt
?
optional<T>
не своего рода указатель на T
это значение, которое
либо T
или ничего Вы не можете иметь «висячий optional
«или любое другое» недопустимое «значение, как вы можете с указателями и ссылками.
nullptr
является объектом, который может быть преобразован в значение любого типа указателя.
nullopt
это объект, который может быть преобразован в значение любого optional
тип.
{}
является (в контексте, ожидающем значение) выражением, которое означает
построенный по умолчанию объект типа T
«, где T
некоторый тип, выведенный из контекста. Если T
тип указателя, он будет сравниваться равным nullptr
, Если T
является optional
типа, он будет сравниваться равным nullopt
, Если T
является арифметическим типом, он будет сравниваться равным 0
, Если T
является одним из стандартных типов контейнеров, он будет сравниваться с другими пустыми контейнерами этого типа.
Почему я не могу использовать
nullptr
вместоnullopt
?
Потому что это разные вещи. Они означают что-то другое, и они используются для чего-то другого.
Необходимо иметь отчетливый nullopt
значение для использования с std::optional
так как nullptr
уже что-то делает:
std::optional<int*> o;
o = nullptr;
assert( o.has_value() );
o = std::nullopt;
assert( !o.has_value() );
И почему
{}
переводится какnullopt
?
(N.B. это верно только для std:optional
не при использовании {}
с другими типами.)
Он делает это, потому что это удобно, чтобы иметь возможность сказать, o = {}
и сделать это правильно, и поэтому спецификация std::optional
написано, чтобы заставить его работать.