无论指针类型如何,都必须将“throw nullptr”捕获为指针吗?

Must `throw nullptr` be caught as a pointer, regardless of pointer type?

提问人:Fedor 提问时间:11/3/2021 最后编辑:StoryTeller - Unslander MonicaFedor 更新时间:11/4/2021 访问量:1405

问:

以下程序抛出,然后捕获异常:nullptrint*

#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

C++ 异常 语言 - 律师

评论

5赞 dan04 11/4/2021
除了测试编译器是否符合 C++ 标准之外,为什么有人想要呢?throw nullptr;
0赞 Pablo H 11/4/2021
@dan04 因为这很容易吗?与 或 相同。简单快速。(很脏。throw 0;throw "bug";
4赞 Thomas Weller 11/4/2021
@dan04:因为我们可以!语言提供了该功能,那么为什么不使用它呢?我也喜欢写作,因为它会让下一个开发人员反思 C++ 是否真的是适合使用的语言 :-)volatile const unsigned const long unsigned int volatile long x = 5;

答:

39赞 alex_noname 11/3/2021 #1

根据标准 [except.handle],看起来像 Visual Studio 中的错误:

处理程序是 Exception 对象类型的匹配项,如果E

[...]

  • 处理程序的类型为 或 其中 是 或 类型,并且是 。cv Tconst T&Tpointerpointer-to->memberEstd​::​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 年。