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 2的break声明,即使它是完全未使用存在,而不是构建.