重新声明异常参数
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" 规则(您引用的规则)。如果您的编译器默默地接受它,那么它就是编译器中的错误。如果它接受它并发出警告,则可能是错误或扩展。
在程序中我们可以像这样重新声明异常参数和函数参数:
#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" 规则(您引用的规则)。如果您的编译器默默地接受它,那么它就是编译器中的错误。如果它接受它并发出警告,则可能是错误或扩展。