У меня есть функция, которая возвращает указатель на объект типа bool для данного имени. Если объект не найден, nullptr
возвращается
Теперь я хотел бы установить переменную в значение возвращенного логического или ложного, если не найден. Могу ли я написать это так?
bool flag = *Get("name");
Это эквивалентно этой более длинной реализации?
bool *result = Get("name");
bool flag = result == nullptr ? false : *result;
Первое неверно, так как вы не можете разыменовать нулевой указатель.
Второе правильно, но упрощает:
bool flag = result && *result;
Если вы хотите избежать result
переменная для каждого вызова, тогда сделайте это следующим образом:
bool istrue(bool const *result) {
return result && *result;
}
bool flag = istrue(Get("name"));
Нет, это не эквивалентно. В первом случае, если ваш метод возвращает nullptr, вы, вероятно, получите ошибку во время выполнения.
Это не эквивалентно. В первом случае вы пытаетесь разыменовать nullptr
который потерпит крах, в то время как во второй вы сначала делаете правильную проверку.
Если я правильно понимаю, вы хотите что-то, что может быть nullptr
, true
или же false
,
Буст-библиотеки (www.boost.org) имеют optional
класс, который вы могли бы использовать:
boost::optional<bool> foo;
Это позволяет вам проверять на ничтожность, используя if (!foo)
и если обратное верно, то вы используете *
восстановить логическое значение.
Два не эквивалентны. Первая реализация вызовет ошибку сегментации (поскольку вы будете пытаться разыменовать нулевой указатель).
Второй вариант верен.