c++ - 替换常量 : when to use static constexpr and inline constexpr?

标签 c++ constants c++17 constexpr

此问题是 C++17: still using enums as constants? 的后续问题.

遗留常量有多种形式,特别是:

  • #define CONSTANT x
  • enum { CONSTANT = x };
  • const/*int/unsigned/whatever*/CONSTANT = x;

关于 static constexprinline constexpr 常量替代的评论让我开始思考更新我们许多遗留常量的主题(特别是 #define 常量)。

据我所知,inline constexpr 值基本上只是替换到位,就像一个内联函数(我已经被证明是错误的)。相反,static constexpr 值作为二进制文件的一部分存储在单独的区域中。假设我理解正确,什么时候应该优先选择一个?我的直觉是,对于整数常量,inline constexpr 通常是首选。

最佳答案

你在 C++17 中的全局常量应该是:

inline constexpr int CONSTANT = 42;

这为您提供了一个很好的一流变量,您可以在常量表达式中使用它并且不会有 ODR 问题。您可以引用它。

宏带来了问题……成为宏。枚举仅限于整数类型。使用 constexpr 变量,您可以拥有任何文字类型。在 C++20 中,您很可能可以随心所欲地编写:

inline constexpr std::vector<int> small_primes = {2, 3, 5, 7, 11};
inline constexpr std::string cool_name = "Barry";

这是唯一允许这样做的选项。

关于c++ - 替换常量 : when to use static constexpr and inline constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466591/

相关文章:

c++ - 头文件中的预编译头文件

c++ - 对类型 'Item *const' 的引用无法绑定(bind)到类型 'const Item *' 的右值

c++ - boost::scoped_ptr 是否违反逻辑常量准则

c++ - 排列值顺序的迭代器

c++ - 将 Python 控制台集成到 GUI C++ 应用程序中

c++ - 使用带有 std::void_t 的类模板检查默认构造函数

c++ - 将 std::any 转换为未知类型

c++ - 基类何时可以具有与相应的完整对象类型不同的布局?

c++ - 从 VC++ 文件发送 HTTP 请求

c++ - 为要在 1 类中使用的结构成员分配常量值