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

throw nullptr是否可被任意指针类型捕获?MSVC异常表现是bug吗

结论

该差异属于MSVC 16.11.2版本的已知bug,GCC、Clang的执行行为符合C++标准要求。

核心原理

  • nullptr的原生类型是std::nullptr_t,C++标准明确规定该类型可以隐式转换为任意类型的指针/成员指针,该转换属于标准认可的合法隐式转换序列。
  • C++异常匹配规则允许抛出的异常类型和catch子句指定的类型之间存在符合规范的标准隐式转换,std::nullptr_t转任意指针类型属于明确允许的匹配场景。

测试用例代码

#include <iostream>

int main() {
    try {
        throw nullptr;
    }
    catch(int*) {
        std::cout << "caught int*";
    }
    catch(...) {
        std::cout << "caught other";
    }
}

符合标准的执行结果应该输出caught int*,只有不符合标准的旧版MSVC才会进入catch(...)分支输出caught other,该bug在后续更高版本的MSVC工具链中已经得到修复。


内容的提问来源于stack exchange,提问作者Fedor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:36:04