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

Лямбда-выражения

Тест разбирает объект замыкания как обычный объект с полями и временем жизни. Вопросы проверяют захват по значению и ссылке, mutable, обобщённые параметры, рекурсию и особенно опасные callback, которые переживают локальные переменные или сам объект.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Какое значение вернёт лямбда после изменения x, если x захвачен по значению?
C++C++20
#include <iostream>
int main(){
    int x = 5;
    auto f = [x]{ return x; };
    x = 8;
    std::cout << f();
}
Вопрос 2 из 25
Какое значение вернёт лямбда после изменения x, если x захвачен по ссылке?
C++C++20
#include <iostream>
int main(){
    int x = 5;
    auto f = [&x]{ return x; };
    x = 8;
    std::cout << f();
}
Вопрос 3 из 25
Зачем нужен init-capture `[p = std::move(ptr)]`?
C++C++20
auto socket = std::make_unique<Socket>(connect());

auto task = [s = std::move(socket)]() mutable {
    s->send("ping");
    s.reset();
};

queue.push(std::move(task));
Вопрос 4 из 25
Что именно захватывает `[this]`?
C++C++20
class Counter {
public:
    auto callback() {
        return [this] { ++value_; };
    }
private:
    int value_ = 0;
};
Вопрос 5 из 25
Как захватить копию самого объекта в C++17?
C++C++20
class Snapshot {
public:
    auto printer() const {
        return [*this] { std::cout << value_; };
    }
private:
    int value_ = 42;
};
Вопрос 6 из 25
Почему без mutable нельзя увеличить x, захваченный по значению?
Вопрос 7 из 25
Какое число выведет второй вызов mutable-лямбды?
C++C++20
#include <iostream>
int main(){
    int x = 10;
    auto next = [x]() mutable { return ++x; };
    next();
    std::cout << next();
}
Вопрос 8 из 25
Меняет ли mutable внешнюю переменную при захвате по значению?
Вопрос 9 из 25
Нужно ли mutable, чтобы менять объект через захваченный указатель?
Вопрос 10 из 25
Какой риск у stateful mutable-лямбды, вызываемой из нескольких потоков?
Вопрос 11 из 25
Что означает параметр `auto x` у лямбды?
C++C++20
auto stringify = [](auto x) {
    using T = decltype(x);
    return std::to_string(static_cast<T>(x));
};

stringify(7);
stringify(3.5);
Вопрос 12 из 25
Как сохранить категорию значения аргумента в generic-лямбде?
C++C++20
auto forward_call = [](auto&& value, auto&& fn) -> decltype(auto) {
    return std::forward<decltype(fn)>(fn)(
        std::forward<decltype(value)>(value));
};
Вопрос 13 из 25
Что даёт синтаксис C++20 `[ ]<class T>(T value) { ... }`?
C++C++20
auto first = []<class T, std::size_t N>(const std::array<T, N>& values)
    -> const T& {
    static_assert(N > 0);
    return values.front();
};
Вопрос 14 из 25
Почему разные вызовы generic-лямбды могут генерировать разные тела?
Вопрос 15 из 25
Что произойдёт с return-типом?
C++C++20
auto twice = [](auto x) { return x + x; };
Вопрос 16 из 25
Почему возвращённая лямбда опасна?
C++C++20
auto make(){
    int x = 42;
    return [&]{ return x; };
}
Вопрос 17 из 25
Как безопаснее передать локальные данные в задачу, которая выполнится позже?
Вопрос 18 из 25
Какой шаблон безопасен для callback объекта под shared_ptr?
Вопрос 19 из 25
Продлевает ли `[&obj]` жизнь obj?
C++C++20
std::function<void()> make_callback() {
    Widget object;
    return [&object] {
        object.refresh();
    };
}

auto callback = make_callback();
callback();
Вопрос 20 из 25
Почему копия `[*this]` может быть логически устаревшей?
C++C++20
class Model {
public:
    auto deferred_snapshot() const {
        return [*this] { return state_; };
    }
    void update(State s) { state_ = std::move(s); }
private:
    State state_;
};
Вопрос 21 из 25
Почему лямбда с захваченным unique_ptr не помещалась в std::function до поддержки move-only обёрток?
Вопрос 22 из 25
Как AddressSanitizer поможет с callback, захватившим ссылку на локальную переменную?
Вопрос 23 из 25
Как написать рекурсивную лямбду без std::function в C++20?
C++C++20
auto fact = [](auto&& self, int n) -> int {
    return n < 2 ? 1 : n * self(self, n - 1);
};
Вопрос 24 из 25
Какой тест выявит, что mutable-лямбда была неожиданно скопирована?
Вопрос 25 из 25
Почему `[=]` не всегда хороший выбор по умолчанию?
C++C++20
class Session {
public:
    auto handler() {
        return [=](Request request) {
            log(id_, request); // захват this, а не копии Session
        };
    }
private:
    int id_ = 0;
};

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

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

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

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