47

Is std::array movable?

In Bjarne Native 2012 presentation slides (slide 41) it lists std::array as one of the only containers that isn't movable.

A quick look on gcc 4.8 libraries source code seems to confirm that std::array is not movable:

std::vector:

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

while in std::array the only method that receives a rvalue reference parameter is the random element access, which avoids a return by copy:

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

Is move-constructor and move-assignment for std::array defaulted created, or is std::array unmovable? If it is unmovable, why std::array cannot be moved while std::vector can?

Ajay
  • 16,823
  • 9
  • 50
  • 94
Alessandro Stamatto
  • 1,449
  • 2
  • 14
  • 18
  • 3
    As a point of interest, the presence or absence alone of a move constructor is not enough to establish that a type is or isn't move constructible (if using the expression/concepts-oriented view on the matter, as is most common). Similarly for move assignment. – Luc Danton Jan 18 '13 at 01:39

1 Answers1

59

std::array is movable only if its contained objects are movable.

std::array is quite different from the other containers because the container object contains the storage, not just pointers into the heap. Moving a std::vector only copies some pointers, and the contained objects are none the wiser.

Yes, std::array uses the default move constructor and assignment operator. As an aggregate class, it's not allowed to define any constructors.

Potatoswatter
  • 126,977
  • 21
  • 238
  • 404