问题描述
最近我在查看 std::array 头文件,我发现了一些奇怪的定义,例如 _GLIBCXX20_CONSTEXPR 或 _GLIBCXX17_CONSTEXPR 等。为什么需要它们?
解决方法
_GLIBCXX20_CONSTEXPR
在使用 C++20 或更新版本时扩展为 constexpr
,否则什么都没有。
_GLIBCXX17_CONSTEXPR
类似,但适用于 C++17。
如果编译器未分别启用对 C++17 或 C++20 的支持,则这些宏为空。由于 C++20 在 C++17 之后添加了更多的 constexpr API,因此需要不同的宏。
存在类似的宏_GLIBCXX14_CONSTEXPR。 C++17 在 C++14 之后增加了更多的 constexpr API。
C++11 之前没有 constexpr API。
示例 std::array<T,N>::at,C++ 容器库 std::array
reference at( size_type pos ); (until C++17)
constexpr reference at( size_type pos ); (since C++17)
在头文件中看起来像
_GLIBCXX17_CONSTEXPR reference at( size_type pos );