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

显式声明默认析构函数时,编译器是否生成移动操作?两种场景对比

C++编译器移动操作生成规则答疑

第一个场景:编译器是否生成移动操作?

给出的代码如下:

class User {
public:
    virtual ~User() = default;
    User( User&& );
    User& operator=( User&& );
    User( User const& );
    User& operator=( User const& );
};

编译器不会生成移动构造函数和移动赋值运算符。原因很直接:当你显式声明了移动构造、移动赋值的函数签名后,编译器会默认认定你打算自行实现这些操作,因此不会再自动生成对应的默认版本。

两个场景的区别与第二个场景的结论

第二个场景的代码:

class User {
public:
    virtual ~User() = default;
    User( User&& )= default;
    User& operator=( User&& )= default;
    User( User const& )= default;
    User& operator=( User const& )= default;
};

场景区别

第一个场景仅声明了移动操作的函数签名,既未提供实现,也未告知编译器要使用默认实现;第二个场景则通过=default显式要求编译器生成符合标准的默认移动操作。

第二个场景的结论

编译器会生成默认的移动构造函数和移动赋值运算符。只要类的成员都支持移动操作(此例中类仅包含默认析构、拷贝/移动操作,无自定义的非移动友好成员),编译器就会生成逐成员移动的默认版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:37:05