サーチ…


前書き

インライン変数は、 1つの定義ルールに違反することなく、複数の翻訳単位で定義することができます。多重定義されている場合、リンカはすべての定義を最終プログラムの単一のオブジェクトにマージします。

クラス定義に静的データメンバーを定義する

inlineで宣言されている場合、そのクラスの静的データメンバーはクラス定義内で完全に定義できます。例えば、次のクラスをヘッダに定義することができます。 C ++ 17より前には、 .cppファイルを提供してFoo::num_instances定義を格納する必要がありました。これは、一度だけ定義されるようになっていましたが、C ++では、inline変数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;


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow