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?
Quick A: Yes.
Yes the memory of std::array is contiguous.
std::array is a container that encapsulates fixed size arrays. This container is an aggregate type with the same semantics as a struct holding a C-style array T[N] as its only non-static data member. Unlike a C-style array, it doesn't decay to T* automatically.
std::array<std::vector<int>,3> is the type you want. std::vector is a dynamicly sized array. this creates a 3 "major" element array of 22 "minor" size.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With