Почему 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){}