编译阶段,g++报告:

warning: dynamic exception specifications are deprecated in C++11 [-Wdeprecated]

或者

error: ISO C++1z does not allow dynamic exception specifications

原因是出在类似以下形式的语句中:

void Func() throw(int);

这条语句中的throw(int)指明了该函数可能抛出int类型的异常。可是C++11已经不建议这样做,而从C++17开始更是禁止这样的声明。现在的正确写法是:

# 可抛出任意异常
void Func();

# 从C++17开始,以下所有写法等效,含义是该函数不会抛出异常
void Func() noexcept; 
void Func() noexcept(true);
void Func() throw(); # 在C++11到C++17之间,这种写法在性能和稳定性上差于前两种写法

手动声明noexcept的目的在于帮助编译器优化代码,但存在风险。当一个被声明为noexcept的函数出现了异常,程序会无视任何情况直接退出。因此目前而言,除非您相当确信这段代码不会出现异常,noexcept声明是不推荐使用的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注