此问题是 C++17: still using enums as constants? 的后续问题.
遗留常量有多种形式,特别是:
#define CONSTANT x
enum { CONSTANT = x };
const/*int/unsigned/whatever*/CONSTANT = x;
关于 static constexpr
和 inline 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/