重新声明异常参数

Redeclaration of the exception parameter

在程序中我们可以像这样重新声明异常参数和函数参数:

#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]:

The name declared in an exception-declaration is local to the handler and shall not be redeclared in the outermost block of the handler.

我们无法重新定义由异常参数表示的实体,但可以重新声明一个。这正是标准在该规则中的含义吗?

该标准正是它所说的意思。一个程序,它在 复合语句 的最外层块中重新声明 exception-declaration(在您的情况下为 e)中使用的名称] 的 handler 格式错误,因为它违反了 "shall" 规则(您引用的规则)。如果您的编译器默默地接受它,那么它就是编译器中的错误。如果它接受它并发出警告,则可能是错误或扩展。