内联变量是一个 C++ 17 新特性
前提
我们想要在一个类里定义时初始化静态成员变量
但是
- C++ 里不允许在类里初始化静态成员变量
- 可以在类内定义,类外初始化静态成员变量,但如果被多个 cpp 文件同时包含的话又会引发新的链接错误(多次定义,预处理保护也没用)
解决方案
- 改用常量
- 用
inline函数或者成员函数封装一层再返回static变量 - 用变量模板
- 把静态成员定义为一个模板类然后继承它
问题:
- 所有这些方法都会导致签名重载,可读性也会变差,使用该变量的方式也变得不同
- 全局变量的初始化可能会推迟到第一次使用时
使用内联变量
使用了 inline 修饰符之后,即使定义所在的头文件被多个 cpp 文件包含,也只会有一个全局对象
这样我们就可以做到追踪类而非对象,进行更细粒度的作用域控制。
struct Example{
inline static std::string gName = "global"; // 整个程序一个
inline static thread_local std::string tName = "tls"; // 每个线程一个
std::string lName = "local"; // 每个实例一个
}
FYI constexpr static成员现在隐含 inline
reference