constexpr静态成员vs变量

时间:2015-01-29 23:56:32

标签: c++ c++11

我偶然发现了一些看起来像这样的C ++ 11代码:

// some_file.h
namespace blah {
  class X {
   public:
    constexpr const static std::initializer_list<uint64> SOME_LIST =
      {1,2,3};
  };
}

// some_file.cpp
#include "some_file.h"
namespace blah {
  constexpr const std::initializer_list<uint64> X::SOME_LIST;
}

编译好。我假设cpp文件中的定义用于避免包含标题的每个文件中的符号重复(如果我错了,请纠正我。)

然后我尝试了以下内容:

// my_file.h
namespace bleh {
  constexpr const static char SOME_CONSTANT[] = "yay";
}

// my_file.cpp
#include "my_file.h"
namespace bleh {
  // if I add this or any other variation, compilation breaks!
  //constexpr const static char SOME_CONSTANT[];
}

如果我在.cpp文件中添加显式定义,则上述代码不起作用。所以我想知道:在第二种情况下是否存在符号重复?如果是这样,有没有办法在没有封闭类的情况下定义变量?

1 个答案:

答案 0 :(得分:2)

static个关键字在这里意味着两件不同的事情:

在文件范围(全局和/或命名空间范围)声明变量或函数时,static关键字指定变量或函数具有内部链接。声明变量时,变量具有静态持续时间,编译器将其初始化为0,除非您指定另一个值。

在类声明中声明数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。必须在文件范围定义静态数据成员。您声明为const static的整数数据成员可以具有初始化程序。

C ++需要您在某处定义静态类成员,因为类符号是全局的(您的成员也是如此)。由于多种定义,这不能在标题中完成。

在第二种情况下,每个编译单元都使用自己的变量,并且没有全局符号。