使用C ++ 17,我们得到内联变量。
其中一个用途是在类中定义常量字段。
那么这两个常数定义之间有什么区别:
class MyClass {
static constexpr int myFirstVar = 10;
static const inline int mySecondVar = 100;
};
当然constexpr
隐式内嵌myFirstVar
。
这里有什么更好的选择,使用constexpr
或inline
?
注意:当你不需要constness时,inline
会让你更容易。使用constexpr
,您没有这个选择。
答案 0 :(得分:47)
您不必在声明时为n
指定初始值设定项。初始化程序也不需要mySecondVar
本身。
这意味着如果我们尝试像这样定义constexpr
:
myFirstVar
或者像这样:
class MyClass {
static constexpr int myFirstVar;
};
int MyClass::myFirstVar = 1;
它的形式都不正确。 #include <cstdlib>
class MyClass {
static constexpr int myFirstVar = rand();
};
语义要求它并且有充分的理由。
constexpr
说明符方法允许我们在头文件中包含一个静态变量定义,而初始化程序不是inline
;或者如果初始化程序相当复杂,则不必在类定义本身中。
所以这是C ++ 17中完全有效的标题:
constexpr
该标准向我们承诺,包含标题的所有翻译单元都会看到变量的相同值,即使我们在运行时之前不知道它是什么。
它主要是图书馆作家工具。假设您的库只是标题。那么在过去的日子里,如果你需要一个这样定义的静态常量,你有什么选择呢?
好吧,您的库可能附带一个目标文件。它将从仅包含常量定义的翻译单元编译。现在图书馆不仅仅是标题。
或者您可以依赖内联函数。内联变量效果可以通过以下方式实现:
#include <cstdlib>
class MyClass {
static const int mySecondVar;
};
inline const int MyClass::mySecondVar = rand();
但是它隐藏在语法墙后面,并使用函数调用操作符来屏蔽本质上是常量。