c++ 为什么“const static int”成员可以在类中初始化,而“const static other”成员却不能?

c8ib6hqw  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(110)

看看下面的代码,这个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++的内置类型,发现

  • 整数成员,如intshortlongchar,可以在类中用const static定义并直接初始化,而
  • 浮点成员,如floatdouble不能。

这让我很困惑。

pdkcd3nj

pdkcd3nj1#

float数据类型是非整数类型,需要constexpr说明符而不是const

struct S {
    constexpr static double af = 8.8;
    const static int ai = 8; 
};

字符串
原始错误消息可以帮助您调试此问题:

error: 'constexpr' needed for in-class initialization of static data member 
'const double myclass::af' of non-integral type

l2osamch

l2osamch2#

好吧,事实上,static const double成员可以在类中初始化-如果你声明它们为inline。如果你想初始化它的值也恰好是一个常量表达式,那么你可以声明它constexpr,在这种情况下,你不需要声明它inline,因为static constexpr数据成员是自动内联的。
然而,当一个static const double成员不是内联的时,这意味着只有一个翻译单元负责提供该成员的 definition,而该定义负责初始化。因为一个类定义需要被#include d到每个想要访问该类成员的翻译单元中,这意味着类内部成员的 * 声明 * 不应该是一个定义(因为这会导致多个定义)。因此,您必须在类外部的某个位置提供静态成员的单个定义,并且该单个定义是负责初始化它的定义。

sr4lhrrt

sr4lhrrt3#

我不知道“为什么浮点类型不能在const double类中初始化,而其他内置类型可以”,但我可以提供其他方法来初始化const static成员:
1.你可以写constexpr double a = 8;,而不是const double a = 8;,这两者之间的区别可以找到here
1.你可以在类外部初始化它,如:

class myclass {
    public:
        const static double a;
};

const double myclass::a = 8;

字符串

相关问题