Что выведет код 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 ошибок.
Предыдущий вопрос
Что выведет: std::move и const
Следующий вопрос
Что выведет: forwarding и перегрузка по категории
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding