【发布时间】:2020-05-17 18:11:05
【问题描述】:
Scott Meyers 在 Effective Modern C++,Item 30 page 210 中写道,有
无需在类中定义整数
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; 是一个定义,但它不是,基于倒数第二个评论。
【问题讨论】:
-
来自 n4835.pdf [class.static.data] (2)
The declaration of a non-inline static data member in its class definition is not a definition [...]。但是 (3) 直接用于具有初始化程序的整数类型,如果这是声明或定义,则本段没有帮助。 -
再想一想,@AndyG,我没有其他要明确说明的内容来明确我的问题。标题以Confusion about开头。而已。我对此感到困惑,我寻求帮助。 对 [...] 的困惑。你能帮我理解一下吗?
-
C++17引入
inline static,厉害了。 -
事后看来,this 也有关系。
标签: c++ static language-lawyer variable-declaration