聚合类型与移动语义:std::array移动构造的标准参考依据是什么?
std::array的隐式移动构造与C++标准依据
先看你给出的代码片段:
#include <string> #include <tuple> class wrap { public: std::array<std::string, 3> a; wrap(std::array<std::string, 3>&& input) : a(std::move(input)){}; };
你提到很多资料说std::array没有移动构造函数,但这段代码里std::move(input)确实能移动它的元素——原因很简单:std::array属于聚合类型,和所有聚合类型一样,它的隐式移动构造函数会逐个移动构造成员(也就是数组的每个元素)。
对应的C++标准参考
在C++11及后续标准中,关于聚合类型的隐式移动构造有明确规定:
- 在[class.copy.move]章节中,当聚合类型没有用户声明的拷贝构造、移动构造、拷贝赋值、移动赋值运算符时,编译器会在满足条件的情况下隐式生成移动构造函数。
- 这个隐式生成的移动构造函数,会按照聚合成员的声明顺序,对每个成员执行移动构造;对于数组类型的成员,会逐个移动构造其元素,这部分规则在[dcl.init.aggr](聚合初始化相关)和[class.copy.move]中都有体现。
你找到的n2904《Defining default copy and move》是C++11标准中确立默认拷贝/移动函数规则的核心提案,其中明确了聚合类型隐式移动构造的行为逻辑,正是现行标准规则的源头。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

