web-dev-qa-db-ja.com

C ++で静的データメンバーを初期化する正しい方法は何ですか(98、11、14)

C++でstaticデータメンバーを初期化する正しい方法は何ですか?また、C++ 98からC++ 11からC++ 14にどのように変更されたかにも興味があります。

次に例を示します。

// bufferedOutput.h
class BufferedOutput
{
 // Static member declaration.
 static long bytecount;
};

// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;

staticデータメンバーを初期化する他の方法はありますか?

28
bodacydo

ルールは常に次のとおりです。

  • 整数型または列挙型のconst静的データメンバー(SDM)は、定数式を使用してクラスで初期化できます。

  • constexpr SDMは、定数式を使用してクラスで初期化する必要があります。

    C++ 17では、デフォルトのコンストラクターがすべてのメンバーを初期化するときに、初期化子が不要になりました。また、constexpr SDMは暗黙的にインライン変数であり、宣言を定義にします(外部定義は非推奨になりました)。

  • 他の種類のSDMは、その定義に初期化子を持つことができます(そのSDMがinlineと宣言されている場合、クラスにあります)。

両方の言語で有効なコードについては、C++ 03とC++ 11 +の間で大きな変更はありません。

インラインではないSDMの場合、クラス内宣言は、初期化子が提供されているかどうかに関係なく、定義ではないため、odrを使用する場合は定義する必要があります。

C++ 17以降では、SDMをインラインにして、クラス内宣言を定義にすることができます。

class BufferedOutput
{
  static inline long bytecount = 50;
};
35
Columbo