为何无需包含<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>?能不能依赖这个特性?
解答
编译通过的原因
是的,多数编译器的<memory>实现里确实间接包含了<utility>。因为std::unique_ptr的移动赋值操作需要用到std::move相关的类型和函数,标准库实现时会引入<utility>来满足自身需求,间接让你的代码也能调用到std::move。能否依赖该特性
绝对不行。这属于标准库的实现细节,C++标准并没有强制要求<memory>必须包含<utility>。不同编译器、同一编译器的不同版本都可能修改这个实现逻辑,一旦变更,你的代码会直接出现编译错误。正确的写法
只要代码中用到了std::move,就显式添加#include <utility>,这是符合标准、保证代码可移植性的唯一可靠做法。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

