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

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

本文关键字:什么 区别 NOEXCEPT 关键字 noexcept      更新时间:2023-10-16

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


EDIT:我刚刚在GitHub上搜索了它,看起来clang也使用了它,所以它不是一个特定于Visual C++的宏。

_NOEXCEPT不是标准宏。前面的下划线表明了这一点,它表示这属于实现。

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

也就是说,它最初是作为编写与多个版本的编译器兼容的代码的一种手段提供的。类似地,可以定义像CPPX_NORETURN这样的宏,以使用编译器特定的方法来指示无返回函数,其中不支持C++属性[[noreturn]]。等等。

宏无处不在。定义宏有许多不同的原因。一个常见的原因是编写的代码可以在不同的C或C++编译器上进行编译,并且变化最小。

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

#define _NOEXCEPT noexcept

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

欢迎来到C/C++世界。。。