Что выведет код Middle Move-семантика обновлено

Что выведет: push_back против emplace_back

Вопрос

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

#include <iostream>
#include <vector>

struct S {
    S() { std::cout << "ctor\n"; }
    S(const S&) { std::cout << "copy\n"; }
    S(S&&) noexcept { std::cout << "move\n"; }
    ~S() { std::cout << "dtor\n"; }
};

int main() {
    std::vector<S> v;
    v.reserve(4);
    v.push_back(S());
    v.emplace_back();
    std::cout << "end\n";
}

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

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

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

Коротко

Код выведет: ctor, move, dtor, ctor, end, dtor, dtor. pushback(S()) создаёт временный объект, перемещает его в вектор и уничтожает временный. emplaceback() конструирует элемент сразу в памяти вектора. reserve(4) исключает реаллокацию между вставками.

Что выведет

ctor
move
dtor
ctor
end
dtor
dtor

Разбор

push_back(S()) создаёт временный объект, перемещает его в вектор и уничтожает временный. emplace_back() конструирует элемент сразу в памяти вектора. reserve(4) исключает реаллокацию между вставками. В конце вектор уничтожает два элемента.

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

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