C++ 是否为派生类生成移动构造函数/赋值运算符
如果类X派生自类Y,且类Y具有以下任何一项:C++ 是否为派生类生成移动构造函数/赋值运算符,c++,c++11,C++,C++11,如果类X派生自类Y,且类Y具有以下任何一项: 用户声明的副本构造函数 用户声明的副本分配运算符 用户声明的析构函数 用户声明的移动构造函数 用户声明的移动分配运算符 如果类X没有声明上述任何一项,那么移动构造函数和移动赋值运算符是否会隐式默认为类X e、 g 我目前正在使用gcc,但我主要感兴趣的是正确的行为应该是什么(与特定编译器是否符合标准相对)就派生类而言,属性或基类具有用户定义或隐式特殊函数这一事实并不重要。重要的是他们的存在 兼容的C++11编译器应该自动为结构和类提供移动构造函数
- 用户声明的副本构造函数
- 用户声明的副本分配运算符
- 用户声明的析构函数
- 用户声明的移动构造函数
- 用户声明的移动分配运算符
我目前正在使用gcc,但我主要感兴趣的是正确的行为应该是什么(与特定编译器是否符合标准相对)就派生类而言,属性或基类具有用户定义或隐式特殊函数这一事实并不重要。重要的是他们的存在 兼容的C++11编译器应该自动为结构和类提供移动构造函数和赋值运算符(如果可能的话)(这在标准中有明确定义),即使只有动态分配缓冲区的类才能真正从中受益(移动
int
只是复制它)
因此,如果您的类嵌入了std::string
或std::unique\u ptr
(例如),那么它的移动构造函数将调用嵌入的string
或unique\u ptr
移动构造函数,并且它将是高效的。。。免费的
因此,只需更改编译模式即可略微提高性能。是的,在§12.8.9中: 如果类X的定义没有显式声明移动构造函数,则将隐式声明一个 默认为当且仅当
- X没有用户声明的复制构造函数
- X没有用户声明的复制分配运算符
- X没有用户声明的移动分配运算符
- X没有用户声明的析构函数,并且
- 移动构造函数不会隐式定义为已删除
X::X(X&&)
同样,对于12.8.20中的移动分配运算符:
如果类X的定义没有显式声明移动赋值运算符,则当且仅当
- X没有用户声明的复制构造函数
- X没有用户声明的移动构造函数
- X没有用户声明的复制分配运算符
- X没有用户声明的析构函数,并且
- 移动分配运算符不会隐式定义为已删除
基类不会直接进入它。与您的问题无关,但为了防止您在使用C++11时不知道它,您现在可以执行
virtual~Y()=default代码>而不是自己定义析构函数(尽管你的编译器可能还不支持它)。@Luc Danton出于兴趣,如果我使用virtual~Y()=default
是否会触发编译器隐式默认移动构造函数/赋值运算符?或者我需要显式默认这些操作吗?@mark-不,不会,因为显式默认的析构函数是用户定义的析构函数。
X::X(X&&)