You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

聚合类型与移动语义: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:52:03