Как избежать ненужных копий при инициализации векторов с вариативными шаблонами

В моем проекте я сталкиваюсь с инициализирующими векторами с вариативным шаблоном. Однако я обнаружил, что некоторые ненужные или неожиданные копии могут происходить в следующем коде (в функциях и ).

      #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решение (копия не называется). Что мне делать или почему я не могу этого сделать? Спасибо!

0 ответов

Другие вопросы по тегам