Что выведет код Middle Лямбды и функциональные объекты спрашивают часто обновлено

Что выведет: захват по значению, по ссылке и mutable

Вопрос

Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.

#include <iostream>

int main() {
    int x = 1;
    auto byVal = [x] { return x; };
    auto byRef = [&x] { return x; };
    x = 2;
    std::cout << byVal() << byRef() << '\n';

    int c = 0;
    auto counter = [c]() mutable { return ++c; };
    counter();
    counter();
    std::cout << counter() << ' ' << c << '\n';
    auto copy = counter;
    std::cout << copy() << counter() << '\n';
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 12, 3 0, 44. byVal хранит копию 1, byRef видит текущее значение 2. counter меняет свою копию c: третий вызов вернёт 3, а внешняя c осталась 0. copy это копия объекта-замыкания вместе с состоянием 3: оба следующих вызова вернут 4, у каждого своя копия.

Что выведет

12
3 0
44

Разбор

byVal хранит копию 1, byRef видит текущее значение 2. counter меняет свою копию c: третий вызов вернёт 3, а внешняя c осталась 0. copy это копия объекта-замыкания вместе с состоянием 3: оба следующих вызова вернут 4, у каждого своя копия.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.