如果类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,但我主要对正确的行为应该是什么感兴趣(而不是特定的编译器是否符合标准).
就派生类而言,属性或基类是否具有用户定义或隐式特殊函数这一事实并不重要。重要的是他们的存在。
如果可能的话(标准中明确定义了这一点),兼容的 C++11 编译器应该自动为结构体和类提供移动构造函数和赋值运算符,即使只有具有动态分配缓冲区的类才能真正从中受益(移动intis只是复制它)。
因此,如果你的类嵌入了 astd::string或 a std::unique_ptr(例如),那么它的移动构造函数将调用嵌入的string或unique_ptr移动构造函数,并且它将是高效的......免费。
因此,简单地更改编译模式应该会稍微提高性能。