построить std :: pair на месте в векторе :: emplace_back - PullRequest
2 голосов
/ 24 апреля 2019

У меня есть класс А, определенный ниже:

class A
{
public:
   A() = default;

   explicit A(uint32_t a, uint32_t b)
   {
      std::cout << "construct" << std::endl;
   }

   A(const A& obj)
   {
      std::cout << "copy" << std::endl;
      *this = obj;
   }

   A(const A&& obj)
   {
      std::cout << "move" << std::endl;
      *this = obj;
   }

   A& operator=(const A& obj)
   {
      std::cout << "copy operator" << std::endl;
      return *this;
   }

   A& operator=(const A&& obj)
   {
      std::cout << "move operator" << std::endl;
   }
};

Я использую класс так:

std::vector<std::pair<A, bool>> v;
v.emplace_back(A(0, 1), true);

emplace_back имеет следующий вывод:

construct
move
copy operator

У меня вопрос, есть ли способ построить А пары на месте, не вызывая move и оператор копирования ?

1 Ответ

5 голосов
/ 24 апреля 2019

Да, std::pair имеет этот конструктор:

cppreference / utility / pair / pair

template< class... Args1, class... Args2 >
pair( std::piecewise_construct_t,
      std::tuple<Args1...> first_args,
      std::tuple<Args2...> second_args );

Пересылает элементы first_argsв конструктор firs t и перенаправляет элементы second_args в конструктор second.Это единственный конструктор не по умолчанию, который можно использовать для создания пары не копируемых неподвижных типов.

Поэтому вы можете вызывать:

std::vector<std::pair<A, bool>> v;
v.emplace_back(std::piecewise_construct, 
               std::make_tuple(0, 1), 
               std::make_tuple(true));
...