当std::variant的备选类型包含可能抛出异常的析构函数时,该std::variant是否应具备nothrow destructible特性?
当std::variant的备选类型包含可能抛出异常的析构函数时,该std::variant是否应具备nothrow destructible特性?
TL;DR:不同编译器对此问题的处理存在分歧,通过编译器对比工具可以看到具体代码的表现差异。
最近遇到个实际问题:如果std::variant的备选类型里存在析构函数可能抛出异常的类型,那这个std::variant本身是否应该被认定为nothrow可析构的?
我发现Clang和GCC在这点上意见不一致,大概率是它们依赖的标准库实现不同;而MSVC则明确认为std::variant应该具备nothrow destructible特性。
查了cppreference的资料,上面说明std::variant的析构函数没有显式的noexcept说明。根据C++的规则,析构函数默认是无条件noexcept的,除非它的成员或者基类包含可能抛出异常的析构函数。但尴尬的是,std::variant的这一特性并没有被标准明确规定,这就直接导致了各个编译器的处理差异。
我问这个问题可不是为了在析构函数里搞抛出异常的骚操作,而是在逐步重构一堆奇怪的遗留代码,这些代码可以简化成涉及“重写函数的异常说明”相关的片段。
备注:内容来源于stack exchange,提问作者smitsyn
相关产品推荐
相关产品推荐

