跳过声明时,为什么需要简单的析构函数?

Pot*_*ter 13 c++ destructor goto

goto或者switch可以跳过一个声明语句,因为它没有初始化器并且构造是微不足道的 - 并且该对象也是可以轻易破坏的.

析构函数约束的基本原理是什么?

struct trivial {
    trivial() = default;
    ~ trivial() = default;
};

struct semi_trivial {
    semi_trivial() = default;
    ~ semi_trivial() noexcept { do_something(); }
};

void foo() {
    goto good_label;  // OK
    trivial foo;
good_label:

    goto bad_label;   // Error: this goto statement
    semi_trivial bar; // cannot jump over this declaration.
bad_label:

    std::cout << "hi\n";
}
Run Code Online (Sandbox Code Playgroud)

小智 5

目前的措辞是N2762的结果.本文给出以下理由:

6.7 stmt.dcl:

    跳过自动变量的定义会产生这样一个问题:该变量的析构函数是否应该在块的末尾运行.因此,析构函数需要是微不足道的,即没有效果.类似地,默认构造函数(可能用于初始化对象的构造函数)也需要不做任何事情,即微不足道.不需要其他要求.

我认为要记住的情况是:

int i = 2;
switch (i) {
  case 1:
    semi_trivial st;
    do_something(st);
    break;
  case 2:
    break; // should st be destructed here?
}
Run Code Online (Sandbox Code Playgroud)

事实上,这不是一个容易回答的问题.调用析构函数不是明显正确的事情.没有好的方法来判断是否应该调用它.在st这里变量只在使用的case 1语句,程序员会感到惊讶,如果它的析构函数得到了由所谓case 2break声明,即使它是完全未使用存在,而不是构建.