禁用动态异常说明
7.28 ID_forbidThrowSpecification
用 throw 关键字声明的“动态异常说明(dynamic exception specification)”已过时。
动态异常说明将所有可能抛出的异常详细列出,如果与实际抛出的异常不一致,会使程序异常终止。
当抛出的异常有变化时,需要根据调用关系修改所有相关函数的异常说明,尤其是牵扯到外部不可控代码时,会大幅增加维护成本,而且动态异常说明具有一定的运行时开销,现已从 C++17 标准中移出。
示例:
int foo() throw(A, B, C); // Non-compliant, drop ‘throw(A, B, C)’
例外:
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