我想在编译器通常自动生成默认构造函数,复制构造函数和赋值运算符的条件下刷新内存。
我记得有一些规则,但我不记得了,也找不到在线有信誉的资源。有人可以帮忙吗?
我想在编译器通常自动生成默认构造函数,复制构造函数和赋值运算符的条件下刷新内存。
我记得有一些规则,但我不记得了,也找不到在线有信誉的资源。有人可以帮忙吗?
Answers:
在下文中,“自动生成”是指“隐式声明为默认值,但未定义为已删除”。在某些情况下,会声明特殊成员函数,但将其定义为已删除。
const
在类中拥有成员会阻止构造函数自动生成...
我发现下面的图非常有用。
= delete
(显而易见)或= default
(对我而言不太明显)的两种情况。我对吗?
C ++ 17 N4659标准草案
有关快速交叉标准的参考,请查看以下cppreference条目的“隐式声明”部分:
当然可以从标准中获得相同的信息。例如在C ++ 17 N4659标准草案中:
15.8.1“复制/移动构造函数”对于复制构造函数说:
6如果类定义未显式声明一个副本构造函数,则隐式声明一个非显式的构造函数。如果类定义声明了move构造函数或move赋值运算符,则隐式声明的copy构造函数将定义为Delete;否则,将其定义为默认值(11.4)。如果该类具有用户声明的副本分配运算符或用户声明的析构函数,则不建议使用后者。
对于移动构造函数:
8如果类X的定义未明确声明移动构造函数,则仅当且仅当非显式类的隐式声明为默认值
(8.1)— X没有用户声明的副本构造函数,
(8.2)— X没有用户声明的副本分配运算符,
(8.3)— X没有用户声明的移动分配运算符,并且
(8.4)— X没有用户声明的析构函数。
15.8.2“复制/移动分配操作员”说:
2如果类定义未显式声明一个副本分配运算符,则隐式声明一个。如果类定义声明了move构造函数或move赋值运算符,则隐式声明的副本赋值运算符将定义为Delete;否则,将其定义为默认值(11.4)。如果该类具有用户声明的副本构造函数或用户声明的析构函数,则不建议使用后一种情况。
对于移动分配:
4如果类X的定义未明确声明移动分配运算符,则仅当且仅当将隐式声明为默认值
- (4.1)— X没有用户声明的副本构造函数,
- (4.2)— X没有用户声明的move构造函数,
- (4.3)— X没有用户声明的副本分配运算符,并且
- (4.4)— X没有用户声明的析构函数。
15.4“析构函数”对析构函数说:
4如果类没有用户声明的析构函数,则将析构函数隐式声明为默认值(11.4)。隐式声明的析构函数是其类的内联公共成员。