Как избежать ненужных копий при инициализации векторов с вариативными шаблонами
В моем проекте я сталкиваюсь с инициализирующими векторами с вариативным шаблоном. Однако я обнаружил, что некоторые ненужные или неожиданные копии могут происходить в следующем коде (в функциях и ).
#include <iostream>
#include <vector>
#include <any>
struct Dummy {
int x;
Dummy() = default;
Dummy(Dummy&&) = default;
Dummy(const Dummy& d) {
x = d.x;
static int count = 0;
printf("copy dummy %d, times: %d\n", x, ++count);
}
Dummy(int x) : x(x) {}
};
template<typename... Comps> std::vector<std::any> create_elements (Comps&&... value) {
return {std::make_any<Comps>(std::forward<Comps>(value))...};
}
template<typename... Dummies> std::vector<Dummy> create_dummies (Dummies&&... value) {
return {std::forward<Dummies>(value)...};
}
int main() {
create_dummies(Dummy(1));
create_elements(Dummy(2));
std::vector<Dummy> w;
w.emplace_back(std::move(Dummy(3)));
return 0;
}
В приведенном выше примере после компиляции и запуска будет
copy dummy 1, times: 1
copy dummy 2, times: 2
, Который означает, чтоcreate_elements
иcreate_dummies
вызвать конструктор копии Dummy. Я ожидаю, что эти два метода будут вести себя так же, какemplace_back
решение (копия не называется). Что мне делать или почему я не могу этого сделать? Спасибо!