αλε*_*λυτ 11 c++ destructor language-lawyer c++11
根据这些指导方针:
如果需要默认析构函数,但其生成已被抑制(例如,通过定义移动构造函数),请使用
=default
.
我无法想象,如果没有具有移动构造函数的类中的显式默认析构函数,代码将会格式错误.
有人可以告诉我上面的例子确认报价吗?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}
Run Code Online (Sandbox Code Playgroud)
我认为这将是某种错误,默认析构函数的隐式声明应该与移动构造函数的定义无关.
从标准,12.4 $ 4,5 Destructors [class.dtor]
4如果类没有用户声明的析构函数,则析构函数被隐式声明为默认值(8.4).隐式声明的析构函数是其类的内联公共成员.
5如果出现以下情况,则将类X的默认析构函数定义为已删除:
(5.1) - X是一个类似联合的类,它有一个带有非平凡析构函数的变体成员,
(5.2) - 任何可能构造的子对象具有类型M(或其数组),并且M具有已删除的析构函数或无法从默认析构函数中获取的析构函数,
(5.3) - 或者,对于虚拟析构函数,查找非数组释放函数会导致歧义或在默认析构函数中删除或无法访问的函数中.