noexcept 关键字和_NOEXCEPT宏有什么区别?
What's the difference between the noexcept keyword and _NOEXCEPT macro?
我是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++世界。。。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?