关于静态常量数据成员的声明和定义的混淆

问题描述 投票:4回答:1

[斯科特·迈耶斯(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数据成员;仅声明就足够了,那么示例代码为...

c++ static variable-declaration
1个回答
0
投票

[看此Draft Standard,您的示例似乎落入灰色区域。虽然没有explicit

© www.soinside.com 2019 - 2024. All rights reserved.