std::optional
Честно говорим «значения может не быть»
После урока ты сможешь
- Возвращать std::optional из функций поиска и разбора
- Безопасно доставать значение: has_value, value_or
- Не путать отсутствие значения с нулём или пустой строкой
Шаг 1 из 6
Значения может не быть
Функция ищет пользователя по логину. А если такого нет? Что ей вернуть?
Старые программы выкручивались «особыми» значениями: -1 для индекса, пустая строка для имени, 0 для цены. Это работает, пока однажды 0 или пустая строка не окажутся настоящим значением. Бесплатный товар с ценой 0 вдруг «пропадает» из каталога.
std::optional<T> честно говорит: «здесь либо значение типа T, либо ничего».
#include <optional>
#include <print>
#include <string>
#include <vector>
std::optional<int> findIndex(const std::vector<std::string>& names, const std::string& target) {
for (std::size_t i = 0; i < names.size(); ++i) {
if (names[i] == target) {
return static_cast<int>(i); // есть значение
}
}
return std::nullopt; // значения нет
}
int main() {
const std::vector<std::string> team{"Аня", "Борис", "Вика"};
if (const auto index = findIndex(team, "Борис")) {
std::println("Борис на позиции {}", *index);
}
if (!findIndex(team, "Гоша")) {
std::println("Гоши в команде нет");
}
}
Тип возвращаемого значения std::optional<int> сам документирует функцию: результата может не быть, и вызывающий код обязан это проверить.