为什么在C+中只能初始化整型或枚举类型+;上课? 我不明白为什么C++只允许在类声明中定义整型和枚举(枚举也是一个整数类型)。而所有其他类型,包括浮点类型(即double和float),都必须在类声明之外定义。很明显,这肯定是一个原因,但我不明白

为什么在C+中只能初始化整型或枚举类型+;上课? 我不明白为什么C++只允许在类声明中定义整型和枚举(枚举也是一个整数类型)。而所有其他类型,包括浮点类型(即double和float),都必须在类声明之外定义。很明显,这肯定是一个原因,但我不明白,c++,c++11,enums,int,C++,C++11,Enums,Int,代码示例: #include <iostream> using namespace std; struct Node { static const int c = 0; // Legal Definition static const long l = 0l; // Legal Definition static const short s = 0; // Legal Definition static const float f = 0.0f; //

代码示例:

#include <iostream>

using namespace std;

struct Node {

  static const int c = 0;  // Legal Definition 
  static const long l = 0l; // Legal Definition 
  static const short s = 0; // Legal Definition 

  static const float f = 0.0f; // Illegal definition 
  static const string S = "Test"; // Illegal definition 

  static const string JOB_TYPE; // Legal declaration
  static const float f; // Legal declaration 
  static const double d; // Legal declaration 
};

const string Node::JOB_TYPE = "Test"; // correct definition
const float Node::f = 0.0f;  // correct definition 
const double Node::d = 0.0;  // correct definition 

int main() {

  cout << Node::c << endl;
  cout << Node::c << endl;

  cout << Node::JOB_TYPE << endl;

  cout << Node::f << endl;

}
#包括
使用名称空间std;
结构节点{
静态常量int c=0;//合法定义
静态常量长l=0l;//合法定义
static const short s=0;//合法定义
静态常量浮点f=0.0f;//定义非法
静态常量字符串S=“Test”//定义非法
static const string JOB_TYPE;//合法声明
static const float f;//合法声明
static const double d;//合法声明
};
常量字符串节点::JOB_TYPE=“Test”//正确定义
常量浮点节点::f=0.0f;//正确定义
常数双节点::d=0.0;//正确定义
int main(){

cout这里的关键原因是整数类型(以及
enum
,因为在编译器中,这些类型成为某种类型的整数)可以简单地替换,并直接用作常量

换句话说,
struct S{static const int x=42;}
,如果编译器看到
S::x
,它可以立即将其替换为生成代码中的常量
42
。情况并非如此(总是如此)适用于
float
,当然也不适用于依赖构造函数的类型,如
std::string
——编译器无法为
std::string
分配内存,而不调用
new
(或
std::string::allocator
)。因此,对于必须“构造”的常量和/或对于如何使用它们有更复杂的标准(想想一个不支持浮点的处理器——加载和存储浮点值的函数调用,等等),语言不能规定应该允许它这样做

如果将
struct节点
声明包含在
static const std::string S=“test”中
,编译器应该将
节点::S
存储在多少个位置?当它最终将三个翻译单元链接到一个程序中时,它应该使用哪一个?还是应该使用不同的翻译单元?如果您对
节点::S
进行强制转换并对其进行修改,会发生什么情况?后者假设您有一个is不会导致崩溃,这是完全合理的,虽然这是未定义的行为,但我不确定编译器是否应该像在这种情况下在每个翻译单元中使用不同的值那样奇怪

编辑:
正如在评论中提到的,C++11确实允许以类似的方式使用更多类型,因此随着编译器和硬件技术的改进,限制正在放宽。我怀疑您是否能够
static const std::map a={…}
tho',因为这是一种相当复杂的数据类型,要构造…

初始化
std::string
需要在运行时执行一些代码


使用字符串文字初始化指针需要将字符串放在内存中的某个位置,也放在运行时。

如果将
节点
结构放在头中,并将其包含在两个文件中,您就会遇到问题。这是一个非常好的问题-我的大脑细胞在本周日发出警报。感谢浮点的特殊规则是常见的这是因为担心交叉编译器,即在一个系统上运行但为另一个系统生成代码的编译器。处理与目标系统匹配的整数类型很容易;获取另一个系统的浮点类型的详细信息要复杂得多。@Pierreemanuellallemant我对其中的代码没有任何问题self。我只是想了解这种设计选择背后的原因。当声明为
const
并用常量表达式初始化时,这些类型可以在需要编译时常量的上下文中使用。因此,C++11对声明为
constepr
的静态成员进行了扩展。请注意,类中的initial“整型化不是对象的定义,它只提供一个值,而不是存储。”这里的关键原因是整型类型(以及枚举,因为在编译器中这些类型成为某种类型的整数)可以简单地替换,并直接用作常量。”更一般地说,文字类型可以这样使用——也许我们可以希望规则会放宽以包括这些?好吧,问题是文字也可能是浮点值[不确定是否还有其他值],并且它们通常需要特殊处理—特别是在没有内置浮点支持的硬件上。@ChrisBeck“将被放松”->“被放松”。更一般地说,所有文字类型,[class.static.data]p3