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
相关产品推荐
相关产品推荐

