提问人:Fedor 提问时间:11/3/2021 最后编辑:StoryTeller - Unslander MonicaFedor 更新时间:11/4/2021 访问量:1405
无论指针类型如何,都必须将“throw nullptr”捕获为指针吗?
Must `throw nullptr` be caught as a pointer, regardless of pointer type?
问:
以下程序抛出,然后捕获异常:nullptr
int*
#include <iostream>
int main() {
try {
throw nullptr;
}
catch(int*) {
std::cout << "caught int*";
}
catch(...) {
std::cout << "caught other";
}
}
在 Clang 和 GCC 中,程序成功打印,演示: https://gcc.godbolt.org/z/789639qbbcaught int*
但是,在 Visual Studio 16.11.2 中,程序会打印 .这是 MSVC 中的错误吗?caught other
答:
39赞
alex_noname
11/3/2021
#1
根据标准 [except.handle],看起来像 Visual Studio 中的错误:
处理程序是 Exception 对象类型的匹配项,如果
E
[...]
- 处理程序的类型为 或 其中 是 或 类型,并且是 。
cv T
const T&
T
pointer
pointer-to->member
E
std::nullptr_t
评论
1赞
Fedor
11/4/2021
谢谢。我报告了 MSVC 错误:developercommunity.visualstudio.com/t/...
3赞
alex_noname
11/4/2021
相应的 GCC 错误报告。此问题已在 GCC 7 中修复。
1赞
Thomas Weller
11/4/2021
@alex_noname感谢您的链接。这让我完全放松了。每当 PM 或 PO 下次与我交谈时,我都会提到这个错误并告诉他们解决问题不会需要 2 周,而是 4 年。
评论
throw nullptr;
throw 0;
throw "bug";
volatile const unsigned const long unsigned int volatile long x = 5;