具有以下代码的问题是“const double”类型的静态成员,不能有类内初始值设定项。为什么仅适用于以下代码中的'const double'?请帮帮我。
class sample{
static const char mc = '?';
static const double md = 2.2;
static const bool mb = true;
};
const char sample::mc;
const double sample::md;
const bool sample::mb;
int main(){
}
答案 0 :(得分:46)
C ++ 03语言标准实现的逻辑基于以下原理。
在C ++中,初始值设定项是对象定义的一部分。你在类中为静态成员编写的内容实际上只是一个声明。因此,正式来说,直接在类中指定任何静态成员的初始值设定项是“不正确的”。它违背了该语言的一般声明/定义概念。无论如何,您在类中声明 的静态数据都必须定义。在那里,您将有机会指定初始化器。
此规则的例外是针对静态整数常量,因为C ++中的这些常量可以形成积分常量表达式(ICE)。 ICE在语言中起着重要作用,为了使它们按预期工作,必须在所有翻译单元中显示积分常数的值。为了使某些常量的值在所有翻译单元中都可见,它必须在声明处可见。为了实现这一点,该语言允许直接在类中指定初始化程序。
此外,在许多硬件平台上,常量整数操作数可以直接嵌入到机器命令中。或者可以完全消除或替换常量(例如,乘以8
可以实现3
的移位。为了便于生成具有嵌入操作数和/或各种算术优化的机器代码,在所有翻译单元中显示积分常数的值是很重要的。
非整数类型没有任何类似于ICE的功能。此外,硬件平台通常不允许将非整数操作数直接嵌入到机器命令中。因此,上述“规则的例外”并未扩展到非整数类型。它只是一无所获。
答案 1 :(得分:12)
Pre-C ++ 11,只能在类定义中直接初始化 const
整数类型。它只是标准规定的限制。
使用C ++ 11,这不再适用。
答案 2 :(得分:8)
编译器让我使用constexpr
代替const
:
static_consts.cpp:3:29: error: ‘constexpr’ needed for in-class initialization of static data member ‘const double sample::md’ of non-integral type [-fpermissive]
static_consts.cpp:7:22: error: ‘constexpr’ needed for in-class initialization of static data member ‘const double sample::md’ of non-integral type [-fpermissive]
我刚接受了这个提议:
class sample{
static const char mc = '?';
static constexpr double md = 2.2;
static const bool mb = true;
};
const char sample::mc;
const bool sample::mb;
int main(){
}
现在它编译得很好(C ++ 11)。