C++ C++  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

optional, variant и any

Тест сравнивает три разных способа выразить неопределённость: значение может отсутствовать, принадлежать закрытому набору типов или быть почти произвольного типа. Вопросы проверяют, не прячется ли ошибка в “удобном” any и не теряется ли состояние в исключении bad_variant_access.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что выражает `std::optional<int>` лучше обычного int с -1 как sentinel?
C++C++20
std::optional<int> find_index(std::string_view name);

if (auto index = find_index("root")) {
    use(*index);            // 0 — допустимый найденный индекс
} else {
    report_not_found();
}
Вопрос 2 из 25
Что произойдёт при вызове `opt.value()` у пустого optional?
C++C++20
std::optional<int> value;

try {
    std::cout << value.value();
} catch (const std::bad_optional_access& error) {
    std::cerr << error.what();
}
Вопрос 3 из 25
Что выведет value_or(7) для пустого optional<int>?
C++C++20
#include <iostream>
#include <optional>
int main(){
    std::optional<int> x;
    std::cout << x.value_or(7);
}
Вопрос 4 из 25
Почему `std::optional<T&>` отсутствует в стандартном optional?
C++C++20
int value = 42;
// std::optional<int&> ref = value; // такой специализации нет

std::optional<std::reference_wrapper<int>> ref = std::ref(value);
ref->get() = 7;
Вопрос 5 из 25
Когда `optional<optional<T>>` может быть осмыслен?
C++C++20
enum class FieldState { Missing, Null, Value };

struct ParsedField {
    FieldState state;
    std::optional<std::optional<int>> value;
};
// outer nullopt: поле отсутствует; inner nullopt: явный null
Вопрос 6 из 25
Главное отличие variant от any?
C++C++20
using Payload = std::variant<Text, Image, Error>;
Payload payload = Image{/*...*/};
std::visit(Visitor{}, payload);
Вопрос 7 из 25
Что показывает `v.index()`?
C++C++20
using Value = std::variant<int, std::string, Error>;
Value value = std::string("ok");

std::cout << value.index();
// Индекс связан с порядком альтернатив в объявлении типа.
Вопрос 8 из 25
Зачем добавляют `std::monostate` первой альтернативой?
C++C++20
using Result = std::variant<std::monostate, Success, Failure>;

Result result; // корректно создаётся в первом, “пустом” состоянии
if (std::holds_alternative<std::monostate>(result))
    start_request();
Вопрос 9 из 25
В какой ситуации `std::variant` может перейти в состояние `valueless_by_exception`?
Вопрос 10 из 25
Что не так с `std::variant<int, int>`?
C++C++20
std::variant<int, int> value(std::in_place_index<0>, 7);

// std::get<int>(value); // тип встречается дважды — обращение по типу неоднозначно
std::cout << std::get<0>(value);
Вопрос 11 из 25
Что делает std::visit?
Вопрос 12 из 25
Почему generic-visitor `[](const auto& x){ ... }` должен компилироваться для всех альтернатив?
C++C++20
using Event = std::variant<Opened, Data, Closed>;

std::visit([](const auto& event) {
    // Тело инстанцируется для Opened, Data и Closed.
    log(event.timestamp());
}, current_event);
Вопрос 13 из 25
Как собрать visitor из нескольких лямбд-перегрузок?
Вопрос 14 из 25
Какое требование std::visit предъявляет к результатам вызова visitor для всех сочетаний альтернатив?
Вопрос 15 из 25
Как обработать добавление новой альтернативы так, чтобы компилятор помог?
Вопрос 16 из 25
Что произойдёт при `std::any_cast<int>(a)`, если a хранит std::string?
C++C++20
std::any value = std::string("42");

try {
    std::cout << std::any_cast<int>(value);
} catch (const std::bad_any_cast& error) {
    std::cerr << error.what();
}
Вопрос 17 из 25
Как проверить any без исключения?
Вопрос 18 из 25
Что означает `a.has_value()`?
C++C++20
std::any payload;
std::cout << payload.has_value();

payload = 42;
std::cout << payload.has_value();

payload.reset();
std::cout << payload.has_value();
Вопрос 19 из 25
Как узнать std::type_info хранимого значения?
C++C++20
std::any payload = std::vector<int>{1, 2, 3};

if (payload.has_value()) {
    const std::type_info& type = payload.type();
    std::cout << type.name();
}
Вопрос 20 из 25
Почему any может быть плохим полем основной бизнес-сущности?
Вопрос 21 из 25
Какой тип результата яснее для “либо значение, либо подробная ошибка”?
C++C++23
std::expected<Config, ParseError> parse_config(std::string_view text);

auto result = parse_config(input);
if (!result)
    return report(result.error());
return start(*result);
Вопрос 22 из 25
Как протестировать visitor variant?
Вопрос 23 из 25
Что стоит проверить у optional-returning поиска?
Вопрос 24 из 25
Какой тест выявит неправильный any_cast?
Вопрос 25 из 25
Почему property-тест полезен для переходов variant-состояний?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу