【问题标题】:Need for declare destructor as default需要将析构函数声明为默认值
【发布时间】:2016-01-20 04:06:16
【问题描述】:

根据these指南:

如果需要默认析构函数,但它的生成已经 抑制(例如,通过定义移动构造函数),使用=default

我无法想象如果在具有移动构造函数的类中没有显式默认析构函数,代码何时会出现格式错误。

有人可以给我看上面的例子吗?

struct S {
    S() {};
    S( S&& ) {}; // move ctor
};

int main() {
    S s; // there is no need to declare dtor explicitly =default
}

【问题讨论】:

  • 错字? "如果需要默认的构造函数..."
  • @songyuanyao 我不这么认为。部分描述了析构函数的用法
  • 即使部分有几个错别字(不可编译的代码混合A/Fa/act

标签: c++ c++11 destructor language-lawyer


【解决方案1】:

我认为这是某种错误,默认析构函数的隐式声明应该与移动构造函数的定义无关。

从标准来看,12.4$4,5 析构函数 [class.dtor]

4 如果一个类没有用户声明的析构函数,则析构函数是 隐式声明为默认值(8.4)。隐式声明 析构函数是其类的内联公共成员。

5 类 X 的默认析构函数在以下情况下被定义为已删除:

(5.1) — X 是一个类联合类,它有一个变体成员 非平凡的析构函数,

(5.2) — 任何可能构造的子对象都具有类类型 M(或 数组)并且 M 有一个已删除的析构函数或一个析构函数 无法从默认析构函数访问,

(5.3) — 或者,对于虚拟析构函数,查找非数组 释放函数会导致歧义或导致函数 从默认析构函数中删除或无法访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2020-11-08
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多