Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否为派生类生成移动构造函数/赋值运算符_C++_C++11 - Fatal编程技术网

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

C++ 是否为派生类生成移动构造函数/赋值运算符,c++,c++11,C++,C++11,如果类X派生自类Y,且类Y具有以下任何一项: 用户声明的副本构造函数 用户声明的副本分配运算符 用户声明的析构函数 用户声明的移动构造函数 用户声明的移动分配运算符 如果类X没有声明上述任何一项,那么移动构造函数和移动赋值运算符是否会隐式默认为类X e、 g 我目前正在使用gcc,但我主要感兴趣的是正确的行为应该是什么(与特定编译器是否符合标准相对)就派生类而言,属性或基类具有用户定义或隐式特殊函数这一事实并不重要。重要的是他们的存在 兼容的C++11编译器应该自动为结构和类提供移动构造函数

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

  • 用户声明的副本构造函数
  • 用户声明的副本分配运算符
  • 用户声明的析构函数
  • 用户声明的移动构造函数
  • 用户声明的移动分配运算符
如果类X没有声明上述任何一项,那么移动构造函数和移动赋值运算符是否会隐式默认为类X

e、 g


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

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

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

因此,如果您的类嵌入了
std::string
std::unique\u ptr
(例如),那么它的移动构造函数将调用嵌入的
string
unique\u ptr
移动构造函数,并且它将是高效的。。。免费的


因此,只需更改编译模式即可略微提高性能。

是的,在§12.8.9中:

如果类X的定义没有显式声明移动构造函数,则将隐式声明一个 默认为当且仅当

  • X没有用户声明的复制构造函数
  • X没有用户声明的复制分配运算符
  • X没有用户声明的移动分配运算符
  • X没有用户声明的析构函数,并且
  • 移动构造函数不会隐式定义为已删除
和§12.8.10

类X的隐式声明的move构造函数的形式为

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&&)