goto
或switch
可以跳过一个声明语句,因为它没有初始化器并且结构很简单 - 而且该对象也非常简单可破坏。 / 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";
}
答案 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}}语句调用,程序员会感到惊讶,即使它完全是在那里没有使用而且没有建造。