Mediumc++17optional

Что такое std::optional и когда его использовать?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

std::optional<T> (C++17) — значение, которое может быть, а может не быть. Альтернатива sentinel-значениям (-1, nullptr) или исключениям. Внутри: хранилище для T + bool флаг, без динамической аллокации.

std::optional<int> find(const std::vector<int>& v, int x) {
    for (size_t i = 0; i < v.size(); ++i)
        if (v[i] == x) return i;
    return std::nullopt;
}

auto r = find(data, 42);
if (r) std::cout << *r;            // доступ к значению
int v = r.value_or(-1);            // значение или дефолт
// r.value();                       // бросает bad_optional_access, если пусто

Применять для функций, которые могут «неудачно завершиться» без исключения: парсинг строки в число, поиск в коллекции, запрос к кэшу; для полей класса, инициализируемых позже.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.