Почему boost :: optional :: is_initialized() устарел?

Сегодня я заметил, что boost::optional::is_initialized() помечен как устаревший в ссылке Boost 1.64.0. Мои проекты либерально разбрызгиваются is_initialized() чтобы проверить, содержит ли boost::optional значение.

Я не вижу другого способа правильно проверить, инициализирован ли boost::optional, я что-то упустил?

У boost::optional есть explicit operator bool(), что означает, что я могу сделать if(foo){...} если foo - boost::optional. Однако это приведет к неправильным результатам, если foo является boost::optional<bool> или некоторым другим boost::optional<T> где T можно конвертировать в bool.

Что Boost ожидает от пользователей?

Ответ 1

Однако это приведет к неправильным результатам, если foo является boost :: optional или некоторым другим boost :: optional, где T конвертируется в bool.

Нет, потому что не существует неявного преобразования в базовый тип. "Правда" № опциона всегда относится к его инициализированному состоянию.

Единственный раз, когда у вас сложилось впечатление, что неявные преобразования происходят в реляционных операторах. Тем не менее, это не делает неявное преобразование в базовый тип, а делает лифтинг операторов явно.

¹, под которым я подразумеваю контекстуальное (явное) логическое преобразование

Обновить

Действительно, для boost::optional<bool> существует предостережение в режиме pre-С++ 11:

Во-вторых, хотя необязательный <> обеспечивает контекстное преобразование в bool в С++ 11, это относится к неявному преобразованию старых компиляторов

В этом случае явно лучше явно сравнивать с boost::none.

Ответ 2

Для будущих ссылок, как указано в документации повышения, вы можете сравнить, как это теперь:

boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
boost::optional<int> o1 = 1;

assert(oN != o0);
assert(o1 != oN);
assert(o0 != o1);
assert(oN == oN);
assert(o0 == o0);

Вы могли бы даже сделать:

if(oN != 2){}

или просто проверить, установлено ли значение:

if(oN){}