Object Lifetime
inline
C++17 允许在头文件内部定义 inline 变量,这和函数的 inline 类似,目的是为了避免多重定义的问题。inline 变量在每个包含它的翻译单元中都是相同的实体,从而保证了全局唯一性。自此,无需再为头文件中声明的 static 变量单独在源文件中进行定义。使用方式如下:
// header file example
struct MyClass
{
static const int sValue;
};
inline const int MyClass::sValue = 777;
// or
struct MyClass
{
static inline const int sValue = 777;
};
constexpr 时隐式具有 inline 属性,因此在类内定义并初始化时无需额外加 inline。
在此之前很多 header-only 的类库需要 inline 函数来避免多重定义的问题。C++17 引入 inline 变量后,这类问题得以简化,比如下面这个例子,C++ 标准保证所有编译单元中 MyClass::seed 都是同一个实体(拥有相同的内存地址),并且是在运行时初始化的。