You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:09:31