[斯科特·迈耶斯(Scott Meyers)在《有效的现代C ++》第210页第30项中写道,
无需在类中定义整数
static const
数据成员;声明就足够了,那么示例代码是
定义,因为它为class Widget { public: static const std::size_t MinVals = 28; // MinVals' declaration; ... }; ... // no defn. for MinVals std::vector<int> widgetData; widgetData.reserve(Widget::MinVals); // use of MinVals
我确信
static const std::size_t MinVals = 28;
是声明并且也是
MinVals
提供了一个值,但注释似乎声称这只是一个声明;第二条评论实际上声称没有定义。代码后的文本,的确是:
MinVals
缺少定义。[确认
static const std::size_t MinVals = 28;
不是定义,所以我有点困惑。
cppreference对我没有多大帮助(我的粗体为斜体):
如果整数或枚举类型的
static
数据成员为已声明const
(而不是volatile
),则可以使用一个初始化器对其进行初始化,其中每个表达式都是一个常量表达式,就在类定义内:struct X { const static int n = 1; const static int m{2}; // since C++11 const static int k; }; const int X::k = 3;
但是类的前两行对我来说是定义。
关于cppreference的以下示例也是如此:
struct X { static const int n = 1; static constexpr int m = 4; }; const int *p = &X::n, *q = &X::m; // X::n and X::m are odr-used const int X::n; // … so a definition is necessary constexpr int X::m; // … (except for X::m in C++17)
根据第二倒数第二条评论,我曾说过
static const int n = 1;
是定义,但不是。
Scott Meyers在Effective Modern C ++,第30页的第30项中写道,无需在类中定义整数静态const数据成员;仅声明就足够了,那么示例代码为...
[看此Draft Standard,您的示例似乎落入灰色区域。虽然没有explicit