需要声明析构函数为默认值
Need for declare destructor as default
根据这些准则:
如果需要默认析构函数,但它的生成已经完成(例如,通过定义move构造函数),使用
=default
.
我无法想象如果在有移动构造函数的类中没有显式的默认析构函数,代码会是错误的。
谁能给我举个例子来证实上面的报价?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}
我认为这将是某种错误,默认析构函数的隐式声明应该与move构造函数的定义无关。
来自标准,12.4$4,5 Destructors [class.dtor]
如果一个类没有用户声明的析构函数,则有一个析构函数隐式声明为默认值(8.4)。一个隐式声明的析构函数是其类的内联公共成员。类X的默认析构函数定义为已删除,如果:(5.1) - X是一个类并(union-like)类,它有一个带有a的变体成员非平凡析构函数,
(5.2) -任何潜在构造的子对象具有类类型M(或数组),并且M有一个已删除的析构函数或一个从默认析构函数
中不可访问(5.3) -或者,对于虚析构函数,查找非数组解分配函数会导致歧义,或者导致函数是从默认析构函数中删除或无法访问。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- C++类析构函数使用新值而不是实际值
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 默认析构函数在互斥锁上被阻止
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 如何使默认析构函数非内联?
- 是否可以使用类的析构函数内部函数来重置值?
- 迭代器和简单的赋值/析构函数
- 非默认析构函数会导致不完整的类型错误
- 显式默认析构函数禁用类中的默认移动构造函数
- 为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
- Boost 无锁队列断言用于简单的赋值和析构函数
- 避免对临时、R 值析构函数进行不必要的分配
- C++11 中默认虚拟析构函数的异常规范是什么?
- std:map 析构函数是否调用键析构函数以及值析构函数?
- 我应该默认虚拟析构函数吗?
- std::map如何调用值析构函数
- 需要声明析构函数为默认值
- 为什么当定义析构函数时,编译器不再添加默认的move函数和赋值函数