是否为派生类生成了移动构造函数/赋值运算符

mar*_*ark 5 c++ c++11

如果类X派生自类Y,类Y具有以下任何一个:

  • 用户声明的复制构造函数,
  • 用户声明的复制赋值运算符,
  • 用户声明的析构函数
  • 用户声明的移动构造函数,
  • 用户声明的移动赋值运算符,

移动构造函数和移动赋值运算符是否会为类X隐式默认,只要它声明以上都不是?

例如

struct Y
{
     virtual ~Y() {}

     // .... stuff

};

struct X : public Y
{
   // ... stuff but no destructor, 
   //               no copy/move assignment operator 
   //               no copy/move constructor

   // will X have a default move constructor / assignment operator?
};
Run Code Online (Sandbox Code Playgroud)

我目前正在使用gcc,但我主要对正确的行为应该是什么感兴趣(而不是特定的编译器是否符合标准).

Mat*_* M. 3

就派生类而言,属性或基类是否具有用户定义或隐式特殊函数这一事实并不重要。重要的是他们的存在。

如果可能的话(标准中明确定义了这一点),兼容的 C++11 编译器应该自动为结构体和类提供移动构造函数和赋值运算符,即使只有具有动态分配缓冲区的类才能真正从中受益(移动intis只是复制它)。

因此,如果你的类嵌入了 astd::string或 a std::unique_ptr(例如),那么它的移动构造函数将调用嵌入的stringunique_ptr移动构造函数,并且它将是高效的......免费。

因此,简单地更改编译模式应该会稍微提高性能。