emplace_back
передает заданные ему аргументы конструктору типа элемента, чтобы создать его на месте. Это то, что позволяет использовать emplace_back
без создания временного объекта.
Вы этим не пользуетесь. Вы все еще создаете временный файл в v.emplace_back(Foo(34));
с выражением Foo(34)
. Ссылка на этот временный объект Foo(34)
затем передается конструктору (copy) Foo
для создания элемента на месте, но временный объект уже создан вне вызова emplace_back
.
Вместо этого передать только аргументы конструктору:
v.emplace_back(34);
, который передаст 34
конструктору Foo
, чтобы создать его на месте без какой-либо временной копии.