C++使用GSL合约报错gsl命名空间无fail_fast,契约违例抛什么异常?
GSL契约编译错误与异常类型说明
编译错误原因
你遇到的error: no type named 'fail_fast' in namespace 'gsl'报错,是因为当前主流GSL实现(如微软官方维护的GSL版本)已经废弃了早期草案中的gsl::fail_fast类型命名,该类型已被替换为其他名称。
契约检查失败的抛出异常类型
当你在引入gsl头文件前定义GSL_THROW_ON_CONTRACT_VIOLATION宏时,Expects、Ensures等GSL契约检查失败后,会抛出gsl::contract_violation类型的异常,该类继承自std::exception,支持调用what()方法获取错误详情。
修正后的测试代码
#define GSL_THROW_ON_CONTRACT_VIOLATION #include <gsl/gsl> #include <iostream> int main(void) { try { Expects(false); } catch(const gsl::contract_violation &e) { std::cout << "exception: " << e.what() << '\n'; } return 0; }
注意事项
- 若你使用的是老旧版本的GSL,可能仍保留
gsl::fail_fast类型定义,优先升级到最新稳定版即可统一使用gsl::contract_violation - 如果没有提前定义
GSL_THROW_ON_CONTRACT_VIOLATION宏,GSL默认会在契约违规时直接调用std::terminate终止程序,不会抛出任何异常 GSL_THROW_ON_CONTRACT_VIOLATION宏必须在所有引入gsl头文件的位置之前定义,否则该配置不会生效
内容的提问来源于stack exchange,提问作者SadHak
相关产品推荐
相关产品推荐

