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

为何无需包含<utility>头文件即可使用std::move?

关于std::move头文件依赖的疑问

根据C++标准和官方文档,std::move的定义必须通过包含<utility>头文件来引入,但下面这段只包含<memory>的代码却能在多款编译器上编译通过:

#include <memory>

int main() {
    std::unique_ptr<int> ptr1, ptr2;
    ptr2 = std::move(ptr1);
    return 0;
}

这是为什么?<memory>头文件是不是包含了<utility>?能不能依赖这个特性?

解答

  1. 编译通过的原因
    是的,多数编译器的<memory>实现里确实间接包含了<utility>。因为std::unique_ptr的移动赋值操作需要用到std::move相关的类型和函数,标准库实现时会引入<utility>来满足自身需求,间接让你的代码也能调用到std::move。

  2. 能否依赖该特性
    绝对不行。这属于标准库的实现细节,C++标准并没有强制要求<memory>必须包含<utility>。不同编译器、同一编译器的不同版本都可能修改这个实现逻辑,一旦变更,你的代码会直接出现编译错误。

  3. 正确的写法
    只要代码中用到了std::move,就显式添加#include <utility>,这是符合标准、保证代码可移植性的唯一可靠做法。

内容的提问来源于stack exchange,提问作者bers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:05:00