noexcept 关键字和 _NOEXCEPT 宏有什么区别?

What's the difference between the noexcept keyword and _NOEXCEPT macro?

我是 C++ 的初学者,正在学习 C++11 的一些功能。我注意到的一件事是,在 Visual C++ 标准库的某些部分,作者使用了 _NOEXCEPT 宏而不是 noexcept 关键字。将鼠标悬停在宏上会显示 #define _NOEXCEPT noexcept,所以我有点困惑它的意义所在。两者有什么区别,我应该更喜欢一个吗?


编辑: 我刚刚在 GitHub 上搜索它,看起来 clang 也使用它,所以它不是 Visual C++具体宏。

无处不在的宏。定义宏有很多不同的原因。一个常见的原因是编写可以在不同的 C 或 C++ 编译器上编译的代码,只需进行最少的更改。

例如,假设有一段代码应该能够在不支持 noexcept 的编译器中编译。您可以将关键字用作宏,而不是编写两个单独的代码:

#define _NOEXCEPT noexcept

然后,对于没有 noexcept 的编译器,您可以简单地禁用 _NOECXEPT(即使它可以使用条件宏自动完成)。

而且,欢迎来到 C/C++ 世界...

_NOEXCEPT 不是标准宏。这由前导下划线表示,表示这属于实现。

很可能这个宏被定义为 throw(),直到 Visual C++ 编译器获得对 C++11 中引入的 noexcept 关键字的支持。

也就是说,它最初是作为一种编写与多个版本的编译器兼容的代码的方式提供的。以类似的方式,人们可能会定义一个像 CPPX_NORETURN 这样的宏,以使用特定于编译器的方式来指示 no-return 函数,其中不支持 C++ 属性 [[noreturn]]。等等。