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

Исключения и noexcept

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что означает базовая гарантия исключений?
C++C++20
class Index {
    std::vector<Entry> entries_;
public:
    void rebuild(); // при ошибке объект обязан остаться корректным
};
Вопрос 2 из 25
Что означает сильная гарантия?
C++C++20
auto old_state = state;
try {
    apply_update(state, request);
} catch (...) {
    // наблюдаемое состояние должно совпасть с old_state
    throw;
}
Вопрос 3 из 25
Как copy-and-swap помогает сильной гарантии присваивания?
C++C++20
Buffer& Buffer::operator=(Buffer other) {
    swap(other);
    return *this;
}
Вопрос 4 из 25
Какая гарантия у операции, объявленной `noexcept` и корректно реализованной без завершения программы?
C++C++20
void swap(Buffer& a, Buffer& b) noexcept {
    using std::swap;
    swap(a.data_, b.data_);
    swap(a.size_, b.size_);
}

static_assert(noexcept(swap(a, b)));
Вопрос 5 из 25
Почему “поймать исключение, оставить половину полей новыми и вернуть false” может нарушать даже базовую гарантию?
C++C++20
bool Account::apply(const Change& c) {
    balance_ += c.delta;
    try {
        history_.push_back(c);
    } catch (...) {
        return false; // balance_ уже изменён
    }
    return true;
}
Вопрос 6 из 25
Что произойдёт, если исключение покинет функцию, объявленную noexcept?
C++C++20
void flush() noexcept {
    throw std::runtime_error("disk failure");
}
// исключение не может покинуть noexcept-функцию
Вопрос 7 из 25
Что возвращает оператор `noexcept(expr)`?
C++C++20
template<class T>
constexpr bool safe_move = noexcept(T(std::declval<T&&>()));

static_assert(safe_move<std::unique_ptr<int>>);
// Само выражение-конструктор здесь не выполняется.
Вопрос 8 из 25
Чем заполнить пропуск, чтобы move-конструктор был noexcept только при небросающем перемещении member?
C++C++20
struct T {
    Member member;
    T(T&& other) /* пропуск */;
};
Вопрос 9 из 25
Почему vector может копировать элементы вместо перемещения при росте?
C++C++20
struct Item {
    Item(const Item&);
    Item(Item&&); // не noexcept
};
std::vector<Item> items;
items.emplace_back(); // рост буфера
Вопрос 10 из 25
Можно ли перегружать функции только по различию noexcept?
Вопрос 11 из 25
Что будет разрушено при выходе из f из-за исключения?
Вопрос 12 из 25
Почему исключения обычно ловят как `const std::exception&`?
C++C++20
try {
    parse_document(input);
} catch (const std::exception& error) {
    log(error.what());
    throw;
}
Вопрос 13 из 25
Чем `throw;` внутри catch отличается от `throw e;`?
C++C++20
try {
    load_config();
} catch (const std::exception& e) {
    if (can_recover()) throw;
    throw e;
}
Вопрос 14 из 25
Что произойдёт, если во время раскрутки стека деструктор выбросит второе исключение наружу?
Вопрос 15 из 25
Какую последовательность символов даст раскрутка стека перед входом в обработчик?
C++C++20
#include <iostream>
struct X { char c; ~X(){ std::cout << c; } };
int main(){
    try { X a{'A'}, b{'B'}; throw 1; }
    catch (...) { std::cout << "caught"; }
}
Вопрос 16 из 25
Какой фрагмент безопаснее, если конструктор второго объекта может бросить?
Вопрос 17 из 25
Почему ручная очистка в каждом catch плохо масштабируется?
Вопрос 18 из 25
Как безопасно использовать C API, возвращающий `FILE*`?
C++C++20
using File = std::unique_ptr<FILE, decltype(&std::fclose)>;

File open_file(const char* path) {
    FILE* raw = std::fopen(path, "rb");
    if (!raw) throw std::system_error(errno, std::generic_category());
    return File(raw, &std::fclose);
}
Вопрос 19 из 25
Какой порядок безопаснее для обновления файла “всё или ничего”?
Вопрос 20 из 25
Что не так с `catch (...) { return; }` вокруг операции сохранения?
C++C++20
bool save(const Document& doc) {
    try {
        write_file(doc);
        return true;
    } catch (...) {
        return true; // вызывающий код не увидит отказ
    }
}
Вопрос 21 из 25
Как проверить сильную гарантию метода update?
Вопрос 22 из 25
Что такое fault injection в тестах исключений?
Вопрос 23 из 25
Как добавить контекст и сохранить исходную причину?
Вопрос 24 из 25
Почему тест “функция бросила” недостаточен?
Вопрос 25 из 25
Как обнаружить исключение, случайно выходящее из noexcept-функции, без завершения всего набора тестов?

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

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

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

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