定义静态const std :: string类变量

Max*_*hka 3 c++ const c++11

如何定义静态const std :: string类变量,它可以安全地在我的程序中的任何地方使用?

第一种方法 - 失败静态初始化顺序fiasco:

文件:Consts.h

namespace constants {
    struct Consts {
        static const std::string kVar = "123";
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法 - 导致复制kVar到我们包含此标题的每个翻译单元,这导致一个定义规则违规原则并且可能导致双重释放或在释放错误后使用 - 如果此定义包含在多个cpp文件中,则这是未定义的行为(我想做的,因为我想要全局共享std :: string const).

文件:Consts.h

namespace constants {
   const std::string kVar = "123";
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法(除了使用宏 - 这也是全局如此丑陋的解决方案)以安全的方式定义这样的var?这种结构的最佳实践经验是什么?

Dav*_*aim 5

常见的方法是在头文件中声明静态const变量,但要在cpp文件中使用正确的初始化来定义它:

.h文件:

namespace constants {
    struct Consts {
        static const std::string kVar;
    }
}
Run Code Online (Sandbox Code Playgroud)

.cpp文件:

const std::string constants::Consts::kVar = "123";
Run Code Online (Sandbox Code Playgroud)

另外一件事,命名空间"常量"已经暗示了常量..不需要嵌套名为"Consts"的内部类.松开"Consts"并仅使用具有相同技术的命名空间.