c++ - move 构造函数和 `std::array`

标签 c++ c++11 move-semantics

根据 N3485 §23.3.2.2:

(...) the implicit move constructor and move assignment operator for array require that T be MoveConstructible or MoveAssignable, respectively.

所以,std::array 支持 move 语义,如果它的元素类型支持的话。太好了!

但是,这究竟意味着什么?我倾向于将这种类型描绘为提供符合 STL 接口(interface)的数组的更安全版本,但如果这是真的,那么 std::array 如何 move 构造其元素?我可以对普通数组做同样的事情吗?

最佳答案

However, what does this really mean?

这意味着,如果元素类型是可 move 的,那么数组类型也是。

std::array<movable, 42> move_from = {...};
std::array<movable, 42> move_to = std::move(move_from); // moves all the elements

I tend to picture this type as a safer version of an array providing an STL-compliant interface

不是真的。它是一个数组的包装器,赋予它与聚合类相同的语义 - 包括复制和 move 它的能力。

how can an std::array move-construct its elements?

与任何其他聚合的方式完全相同。它的隐式 move 构造函数将 move 构造它的所有成员,包括任何成员数组的元素。

Can I do the same with an ordinary array?

仅当您将其包装在类类型中时,如 std::array 所做的那样。

关于c++ - move 构造函数和 `std::array`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22613991/

相关文章:

c++ - remove_reference 如何禁用模板参数推导?

c++ - 在派生对象上 move 构造函数

c++ - std::add_pointer,try_add_pointer 在可能的实现中有什么用?

c++ - 从 STL 容器中 move 元素是否会将其从该容器中移除?

c++ - Visual C++ 中弃用的命令

c++ - std::vector::reserve 是否保证在这种情况下实现不会使迭代器无效?

c++ - C++ 11 mersenne_twister_engine 类的问题

C++11:按值调用、 move 语义和继承

c++ - move 由逗号运算符抑制的构造函数

c++ - Doxygen C++ 约定