静态constexpr和C ++ 17中的静态内联变量有什么区别?

时间:2017-07-19 07:11:15

标签: c++ c++17

使用C ++ 17,我们得到内联变量。

其中一个用途是在类中定义常量字段。

那么这两个常数定义之间有什么区别:

class MyClass {
    static constexpr int myFirstVar = 10;
    static const inline int mySecondVar = 100;
};

当然constexpr隐式内嵌myFirstVar

这里有什么更好的选择,使用constexprinline

注意:当你不需要constness时,inline会让你更容易。使用constexpr,您没有这个选择。

1 个答案:

答案 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();

但是它隐藏在语法墙后面,并使用函数调用操作符来屏蔽本质上是常量。