禁用动态异常说明
7.26 ID_forbidThrowSpecification
用 throw 关键字声明的“动态异常说明(dynamic exception specification)”已过时,应使用 noexcept 关键字完成异常说明。
动态异常说明将所有可能抛出的异常详细列出,尤其是牵扯到外部不可控代码时,会大幅增加异常管理成本,而且各编译器相关实现并未统一,现已从 C++17 标准中移出。
示例:
int foo() throw(Exception); // Non-compliant
应改为:
int foo() noexcept(false); // Compliant
例外:
int bar() throw(); // Let it go?
throw() 与 noexcept 等价,C++17 保留了 throw(),但不建议继续使用,审计工具不妨通过配置决定是否放过这种方式。
配置
forbidEmptyThrowSpecification: 是否放过空 throw 异常说明
依据
ISO/IEC 14882:2011 D.4-deprecated
ISO/IEC 14882:2017 D.3-deprecated