C++ constexpr静态成员vs变量

C++ constexpr静态成员vs变量,c++,c++11,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 st

我偶然发现一些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文件中添加显式定义,上面的代码将不起作用。所以我想知道:第二种情况下是否存在符号重复?如果是这样,有没有一种方法可以在没有封闭类的情况下定义变量?

这里的
static
关键字表示两种不同的含义:

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

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

C++需要您在某个地方定义静态类成员,因为类符号是全局的(您的成员也是全局的)。由于有多个定义,无法在标头中执行此操作


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

constexpr const X::SOME_LIST缺少类型说明符。您确定这是编译的代码吗?@typ1232抱歉,我编写的代码没有实际编译,但我正在查看编译的示例。在第二种情况下,有没有办法使用全局符号?我是否应该在这种情况下添加一个类来强制执行?
// 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[];
}