Разница между nullptr, {} и nullopt

Почему я не могу использовать nullptr вместо nullopt? И почему {} переводится как nullopt?

0

Решение

  • optional<T> не своего рода указатель на Tэто значение, которое
    либо T или ничего Вы не можете иметь «висячий optional«или любое другое» недопустимое «значение, как вы можете с указателями и ссылками.

  • nullptr является объектом, который может быть преобразован в значение любого типа указателя.

  • nullopt это объект, который может быть преобразован в значение любого optional тип.

  • {} является (в контексте, ожидающем значение) выражением, которое означает
    построенный по умолчанию объект типа T«, где T некоторый тип, выведенный из контекста. Если T тип указателя, он будет сравниваться равным nullptr, Если T является optional типа, он будет сравниваться равным nullopt, Если T является арифметическим типом, он будет сравниваться равным 0, Если T является одним из стандартных типов контейнеров, он будет сравниваться с другими пустыми контейнерами этого типа.

6

Другие решения

Почему я не могу использовать 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 написано, чтобы заставить его работать.

5

По вопросам рекламы [email protected]