在程序中我们可以重新声明一个异常参数以及一个像这样的函数参数:
#include <exception>
void foo()
try
{
throw *new std::exception();
}
catch (std::exception e)
{
extern int e;
}
int main(){ foo(); }
但标准禁止这样做N4296:3.3.3/3 [basic.scope.block]
:
在异常声明中声明的名称是处理程序的本地名称 并且不得在处理程序的最外层块中重新声明。
我们无法重新定义由exception参数表示的实体,但可以重新声明一个。这正是标准在该规则中的含义吗?
答案 0 :(得分:0)
标准正是它所说的。在的复合语句的最外面的块中重新声明 exception-declaration (在您的情况下为e
)中使用的名称的程序处理程序是不正确的,因为它违反了“应该”规则(你引用的那个)。如果您的编译器以静默方式接受它,那么它就是编译器中的一个错误。如果它接受警告,则可能是错误或扩展。