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;
};
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…