为啥在 cpp 文件中定义了非 int const 静态变量?

Posted

技术标签:

【中文标题】为啥在 cpp 文件中定义了非 int const 静态变量?【英文标题】:Why are non-int const statics defined in cpp file?为什么在 cpp 文件中定义了非 int const 静态变量? 【发布时间】:2016-02-10 13:17:48 【问题描述】:

前几天,我正在寻找如何将静态常量添加到类中。我注意到很多例子都在展示......

(我们会说是公开的)

测试.h

class A 
public:
  static const int HELLO_WORLD=1;
;

但是,我想定义一个字符串,但这没有编译。

测试.h

class A 
public:
  static const std::string HELLO_WORLD="WORLD HELLO";
;

经过一些研究,我发现非整数是不同的。我必须在标头中声明它们,但在 cpp 文件中设置它们的值。

测试.h

class A 
public:
  static const std::string HELLO_WORLD;
;

test.cpp

#include "test.h"
const std::string A:HELLO_WORLD = "WORLD HELLO";

我只能找到有关如何解决它的答案,但实际上并没有找到为什么它需要这样......我的问题是为什么它必须这样,为什么允许声明 + 设置整数?

在 c++11/c++14 中还有更好的方法吗? (不妨问问)

【问题讨论】:

欺骗/相关:***.com/questions/3025997/… 我相信限制是必要的,因为非 pod 类型的构造函数可以做一些讨厌的事情,比如抛出异常。简而言之,如果放宽这些限制,该语言将无法正常工作。 不同的是整数类型。那是个例外。您必须在某处定义静态成员,except 在声明整数类型的 static const 成员时(并且永远不要使用其地址)。 【参考方案1】:

Stroustrup: "在 C++98 中,只有整型的静态 const 成员可以在类中初始化,并且初始化器必须是常量表达式。这些限制确保我们可以在编译时进行初始化-时间。”

试试这个:

class A 
public:
  constexpr static const char *HELLO_WORLD="WORLD HELLO";
;

【讨论】:

以上是关于为啥在 cpp 文件中定义了非 int const 静态变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能定义一个指向 int 指针的低 + *** const 指针?

arduino定义引脚为啥要用const??不用可以吗 const int ledPin=13;

CPP_const&static

cpp

为啥没有为“T* const”定义pointer_traits?

为啥我可以在 std::map<std::string, int> 中使用 const char* 作为键