在类定义中定义静态数据成员

如果声明为 inline,则可以在类定义中完全定义类的静态数据成员。例如,可以在标题中定义以下类。在 C++ 17 之前,有必要提供一个 .cpp 文件来包含 Foo::num_instances 的定义,以便它只定义一次,但在 C++ 17 中,内联变量 Foo::num_instances 的多个定义都是指同样的 int 对象。

// warning: not thread-safe...
class Foo {
  public:
    Foo() { ++num_instances; }
    ~Foo() { --num_instances; }
    inline static int num_instances = 0;
};

作为一种特殊情况,constexpr 静态数据成员是隐式内联的。

class MyString {
  public:
    MyString() { /* ... */ }
    // ...
    static constexpr int max_size = INT_MAX / 2;
};
// in C++14, this definition was required in a single translation unit:
// constexpr int MyString::max_size;