Данные · Контейнеры и алгоритмы

std::optional

Честно говорим «значения может не быть»

~20 мин 6 шагов

После урока ты сможешь

  • Возвращать std::optional из функций поиска и разбора
  • Безопасно доставать значение: has_value, value_or
  • Не путать отсутствие значения с нулём или пустой строкой

Шаг 1 из 6

Значения может не быть

Функция ищет пользователя по логину. А если такого нет? Что ей вернуть?

Старые программы выкручивались «особыми» значениями: -1 для индекса, пустая строка для имени, 0 для цены. Это работает, пока однажды 0 или пустая строка не окажутся настоящим значением. Бесплатный товар с ценой 0 вдруг «пропадает» из каталога.

std::optional<T> честно говорит: «здесь либо значение типа T, либо ничего».

main.cpp
#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> сам документирует функцию: результата может не быть, и вызывающий код обязан это проверить.