关于c ++:static const double不能有类内初始化程序。


static const double cannot have an in-class initializer. why is it so?

具有以下代码的problum是"const double"类型的静态成员,不能具有类内初始值设定项。为什么只适用于下面代码中的"const double"?请帮帮我。

1
2
3
4
5
6
7
8
9
10
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(){
}

该逻辑电路执行的语言是C + + 03标准基于以下的理由。

在C + +对象初始化器是一种部分的定义。你所写的类的静态成员的内幕,其实是一只"宣言"。所以说,正式指定的静态初始化器的成员,任何直接的类是"不正确"的内幕。这是相反的声明定义的概念/通用的语言。你说的任何静态数据已被确定的中间级后反正。这是你的机会,在这里你将有一个到指定的初始值。

从这一个例外的规则是为静态整数常数,这些常数,因为在C++中可以自由表达的积分常数(冰)。它的一个重要的角色在游戏中的语言,和他们的预期工作阶积分常数的值必须是可见的所有的翻译单元。为了使可见一些常数的值在所有的翻译单元,它是在点光"。获得允许指定的语言,直接在类初始化。

许多的硬件平台,以及如何在线operands常数整数可以直接进入嵌入式机器指令。或可以取代常数(或完全两样的,例如,可以实现通过8繁殖的3(移)。为了便于与嵌入式机器码生成和/或不同的arithmetical operands optimizations有它重要的积分常数C值在所有的翻译单元。

非整数的类型没有任何功能上类似于冰。另外,硬件平台不允许嵌入的非正常积分的机械operands直接命令。因为这个原因,"从上述的例外规则"并没有延伸到非整数类型。它也没有简单的实现。


C + +的前11个积分,只constinitialized类型可以直接在类的定义。它的,只是限制强加的标准。

11这与C + +,不再适用。


我使用的编译器(而不是constconstexpr

1
2
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]

我只是接受该要约。

1
2
3
4
5
6
7
8
9
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(){
}

现在它只是compiles精细(C + +)。