看看下面的代码,这个const static int num1 = 8;
编译。但是,const static double num2 = 8.8;
代码给出错误。它们的修饰符都是const static
,那么为什么int
可以工作,但double
和其他浮点类型会导致错误?
struct S {
const static int num1 = 8; // OK
const static double num2 = 8.8; // error
};
字符串
我试过一些C++的内置类型,发现
- 整数成员,如
int
、short
、long
和char
,可以在类中用const static
定义并直接初始化,而 - 浮点成员,如
float
和double
不能。
这让我很困惑。
3条答案
按热度按时间pdkcd3nj1#
float
数据类型是非整数类型,需要constexpr
说明符而不是const
:字符串
原始错误消息可以帮助您调试此问题:
型
l2osamch2#
好吧,事实上,
static const double
成员可以在类中初始化-如果你声明它们为inline
。如果你想初始化它的值也恰好是一个常量表达式,那么你可以声明它constexpr
,在这种情况下,你不需要声明它inline
,因为static constexpr
数据成员是自动内联的。然而,当一个
static const double
成员不是内联的时,这意味着只有一个翻译单元负责提供该成员的 definition,而该定义负责初始化。因为一个类定义需要被#include
d到每个想要访问该类成员的翻译单元中,这意味着类内部成员的 * 声明 * 不应该是一个定义(因为这会导致多个定义)。因此,您必须在类外部的某个位置提供静态成员的单个定义,并且该单个定义是负责初始化它的定义。sr4lhrrt3#
我不知道“为什么浮点类型不能在
const double
类中初始化,而其他内置类型可以”,但我可以提供其他方法来初始化const static
成员:1.你可以写
constexpr double a = 8;
,而不是const double a = 8;
,这两者之间的区别可以找到here1.你可以在类外部初始化它,如:
字符串