What is the correct way to initialize static data members in C++ (98, 11 and 14)

后端 未结 1 868
臣服心动
臣服心动 2020-12-05 04:45

What is the right way to initialize static data members in C++? I\'m also interested in how it has changed from C++98, to C++11 to C++14.

Here is an exa

相关标签:
1条回答
  • 2020-12-05 05:09

    The rules have always been as follows:

    • A const static data member (SDM) of integral or enumeration type can be initialised in class with a constant expression.

    • A constexpr SDM must be initialised in class with a constant expression.

      C++17 no longer requires an initializer when the default constructor initialises every member. Also, constexpr SDMs are implicitly inline variables, which makes their declaration a definition (external definitions are now deprecated).

    • Other kinds of SDMs can have an initializer at their definition (which is in class if that SDM is declared inline).

    Nothing has substantially changed between C++03 and C++11+ for code that is valid in both languages.

    Note that for SDMs that are not inline, the in-class declaration is not a definition—regardless of whether an initializer is provided—and they must be defined if they are odr-used.

    As of C++17, we can make your SDM inline, which makes its in-class declaration a definition:

    class BufferedOutput
    {
      static inline long bytecount = 50;
    };
    
    0 讨论(0)
提交回复
热议问题