显式声明默认析构函数时,编译器是否生成移动操作?两种场景对比
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
相关产品推荐
相关产品推荐

