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

时间:2016-10-01 12:41:26

标签: c++ destructor goto

gotoswitch可以跳过一个声明语句,因为它没有初始化器并且结构很简单 - 而且该对象也非常简单可破坏。 / p>

对析构函数进行约束的理由是什么?

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";
}

1 个答案:

答案 0 :(得分: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?
}

事实上,这不是一个容易回答的问题。调用析构函数不是明显正确的事情。没有好的方法来判断是否应该调用它。这里的st变量仅用于case 1语句,如果它的析构函数被case 2的{​​{1}}语句调用,程序员会感到惊讶,即使它完全是在那里没有使用而且没有建造。