为何C++中const static int可类内初始化,其他类型却不行?
问题原因解析
这是C++不同版本标准的规则差异导致的:
C++03 标准规则
在C++03里,只有**const static修饰的整数类型(包括bool、char、short、int、long等)**允许在类内直接初始化。这类成员会被当作编译期常量,编译器可以直接把值嵌入到使用它的代码里,不需要额外分配内存(除非你取它的地址,这时还是得在类外定义)。
而float、double这类浮点类型,在C++03中不属于允许类内初始化的范畴,必须在类外完成定义和初始化,否则编译器会报错。
C++11 及以后标准规则
C++11放宽了这个限制:
- 用
constexpr static修饰的成员,不管是整数还是浮点类型,都能在类内直接初始化; - 普通的
const static成员,只要属于字面类型(literal type)(浮点类型也属于这类),也支持类内初始化,但部分旧编译器需要你显式开启C++11及以上的编译标准才能生效。
解决方案
针对你的代码,有几种处理方式:
方式1:遵循C++03标准,类内声明+类外初始化
struct S { const static int num1 = 8; // 类内初始化(C++03允许) const static double num2; // 仅声明 }; // 类外定义并初始化浮点成员 const double S::num2 = 8.8;
方式2:使用C++11及以上标准,改用constexpr修饰
struct S { constexpr static int num1 = 8; // OK constexpr static double num2 = 8.8; // C++11及以后支持类内初始化 };
方式3:保持const,开启C++11+编译标准
如果你的编译器支持C++11及以上,直接保留const static并开启对应标准(比如GCC用-std=c++11或更高版本参数),原代码就能正常编译:
struct S { const static int num1 = 8; // OK const static double num2 = 8.8; // C++11及以后允许 };
内容的提问来源于stack exchange,提问作者SleepingCat
相关产品推荐
相关产品推荐

