17

我正在寻找在 C++ 中初始化静态映射的方法,并找到了以下代码:

struct A{
static map<int,int> create_map()
    {
      map<int,int> m;
      m[1] = 2;
      m[3] = 4;
      m[5] = 6;
      return m;
    }
static const map<int,int> myMap;

};

const map<int,int> A:: myMap =  A::create_map();

但是,如果我将最后一行更改为

const static map<int,int> A:: myMap =  A::create_map();

编译器投诉:在定义(而不是声明)静态数据成员时可能不会使用“静态””?

我想知道为什么?这背后的逻辑或推理是什么?

4

3 回答 3

16
static int    a = 0; // grandfathered and still useful, provides static *LINKAGE*
                     // and static STORAGE DURATION
static int X::a = 0; // confusing and illegal, is it static LINKAGE
                     // or static STORAGE DURATION
                     // or static MEMBERSHIP?

static用于变量定义时已经具有含义(在 C 中)。对于学习 C++ 的 C 程序员来说,发现含义有时会发生变化,但并非总是如此,这将是非常令人惊讶的。

所以新的含义(静态成员)只在类定义中有效(C 不允许static关键字)。

于 2013-03-05T22:16:21.847 回答
4

这和没区别

struct A
{
   static int x;
}

int A::x;         //legal
static int A::x;  //illegal

其他一切都只是在这个最小的、概念上相同的示例中抛出的更多关键字。static成员只能在类static定义中声明。

const map<int,int> A:: myMap =  A::create_map();

类之外只是static成员的定义A::myMap。额外的static在那里没有意义。

这背后的原因可能是为了避免混淆 -static自由变量是一种“私有”变量(对于翻译单元)。一个成员static则相反。

于 2013-03-05T22:16:29.327 回答
4

声明一个类成员static意味着它在该类的所有对象之间共享。

当您添加static到类之外的变量定义时,这意味着该变量具有文件范围并且在该文件之外不可见。

如果允许

const static map<int,int> A:: myMap =  A::create_map();

这意味着,您有一个静态成员变量,该变量在此文件之外不可见。这没有任何意义。

于 2013-03-05T22:19:54.010 回答