Доступ к значениям optional
Используйте value_or и has_value
«Доступ к значениям optional» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Оператор разыменования
Самый быстрый способ прочитать значение optional — использовать *opt, но только если Вы уверены, что он содержит значение: проверка при этом не выполняется.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 10;
if (o) std::cout << *o << "\n";
}Метод value()
opt.value() возвращает значение, но выбрасывает исключение std::bad_optional_access, если optional пуст. Используйте его, когда пустой optional действительно означает ошибку.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o;
try { std::cout << o.value() << "\n"; }
catch (const std::bad_optional_access&) { std::cout << "empty!\n"; }
}value_or для значений по умолчанию
opt.value_or(fallback) возвращает содержащееся значение, если оно есть, а в противном случае — fallback. Без ветвления и исключений.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = std::nullopt;
std::cout << o.value_or(-1) << "\n"; // -1
}value_or с реальными данными
Обычно этот приём используют, чтобы задать значение по умолчанию для отсутствующей конфигурации или результата поиска.
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> lookup(bool found) {
if (found) return std::string("Pro");
return std::nullopt;
}
int main() {
std::cout << lookup(false).value_or("Free") << "\n";
}Оператор стрелки
Для optional с типами-классами выражение opt->member позволяет обращаться к членам напрямую (при условии, что optional не пуст).
#include <iostream>
#include <optional>
#include <string>
int main() {
std::optional<std::string> o = std::string("hello");
if (o) std::cout << o->size() << "\n";
}Проверка перед доступом
Безопасная идиома такова: сначала проверьте, затем используйте. Объединение проверки и доступа позволяет избежать как исключений, так и неопределённого поведения.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 7;
if (o.has_value()) {
int x = *o;
std::cout << x * 2 << "\n";
}
}Init-выражение в if
Вы можете объявить переменную и проверить её в одной строке с помощью init-выражения в if, оставив optional в области видимости только этой ветви.
#include <iostream>
#include <optional>
std::optional<int> find() { return 3; }
int main() {
if (auto v = find(); v.has_value())
std::cout << *v << "\n";
}Преобразование (C++23)
Монадные вспомогательные функции, такие как transform, применяют функцию только при наличии значения и возвращают новый optional. Это позволяет удобно выстраивать цепочки вычислений.
and_then для построения цепочек
and_then (C++23) вызывает функцию, которая сама возвращает optional, и устраняет вложенность результата. Это идеально подходит для последовательности шагов, каждый из которых может завершиться ошибкой.
Выбор средства доступа
Используйте value_or, когда у Вас есть подходящее значение по умолчанию, value(), когда пустой optional означает ошибку, достойную исключения, а */-> — только после явной проверки.
Избегайте непроверенного разыменования
Никогда не вызывайте *opt, не убедившись, что optional не пуст. Это неопределённое поведение и распространённая причина сбоев.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли доступ к optional.
Итоги
Вы узнали, как получать доступ к optional:
- Используйте
*и->после проверки. value()выбрасывает исключение для пустого optional.value_orпредоставляет значение по умолчанию.- Монадные функции
transformиand_thenобъединяют операции в цепочки (C++23).
Часто задаваемые вопросы
Урок «Доступ к значениям optional» бесплатный?
Да — полный текст урока «Доступ к значениям optional» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Доступ к значениям optional»?
Используйте value_or и has_value Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Доступ к значениям optional»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Представление отсутствия с optional
- Доступ к значениям optional
- Основы std::expected
- Шаблоны обработки ошибок