Что выведет код Middle Лямбды и функциональные объекты обновлено

Что выведет: generic-лямбда и init-capture

Вопрос

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

#include <iostream>
#include <memory>
#include <string>

int main() {
    auto add = [](auto a, auto b) { return a + b; };
    std::cout << add(1, 2) << ' ' << add(std::string("a"), "b") << ' ' << add(1.5, 1) << '\n';
    auto p = std::make_unique<int>(7);
    auto f = [q = std::move(p)] { return *q; };
    std::cout << f() << ' ' << (p == nullptr) << '\n';
}

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

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

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

Коротко

Код выведет: 3 ab 2.5, 7 1. Generic-лямбда инстанцируется для каждой пары типов: int + int = 3, std::string + const char даёт строку ab, double + int = 2.5.

Что выведет

3 ab 2.5
7 1

Разбор

Generic-лямбда инстанцируется для каждой пары типов: int + int = 3, std::string + const char* даёт строку ab, double + int = 2.5. Инициализирующий захват переместил unique_ptr внутрь лямбды: она возвращает 7, а исходный p пуст.

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

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