Является ли 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 может?
Ответы
Ответ 1
std::array
является подвижным только в том случае, если его содержащиеся объекты перемещаются.
std::array
сильно отличается от других контейнеров, потому что контейнерный объект содержит хранилище, а не только указатели на кучу. Перемещение a std::vector
копирует только некоторые указатели, а содержащиеся объекты не являются более мудрыми.
Да, std::array
использует конструктор перемещения по умолчанию и оператор присваивания. В качестве агрегатного класса ему не разрешено определять какие-либо конструкторы.