Подтвердить что ты не робот

Является ли std:: array подвижным?

Является ли std:: array подвижным?

В Презентационные слайды Bjarne Native 2012 (слайд 41) перечисляет std:: array как один из единственных контейнеров, которые не могут перемещаться.

Быстрый взгляд на исходный код библиотеки gcc 4.8, похоже, подтверждает, что std:: array не перемещается:

std::vector:

/* @brief  %Vector move constructor.
   ...       */
  vector(vector&& __x) noexcept
  : _Base(std::move(__x)) { }

а в std:: array единственным методом, который получает параметр ссылки rvalue, является доступ к случайному элементу, что позволяет избежать возврата путем копирования:

get(array<_Tp, _Nm>&& __arr) noexcept
    { /*...*/ return std::move(get<_Int>(__arr)); }

Является ли move-constructor и move-assignement для std:: array defaulted created или std:: array unmovable? Если он невозможен, почему std:: array не может быть перемещен, а std::vector может?

4b9b3361

Ответ 1

std::array является подвижным только в том случае, если его содержащиеся объекты перемещаются.

std::array сильно отличается от других контейнеров, потому что контейнерный объект содержит хранилище, а не только указатели на кучу. Перемещение a std::vector копирует только некоторые указатели, а содержащиеся объекты не являются более мудрыми.

Да, std::array использует конструктор перемещения по умолчанию и оператор присваивания. В качестве агрегатного класса ему не разрешено определять какие-либо конструкторы.