12

我一直在阅读 Herb Shutter 的“Exceptional C++”,“Item 1 : #define or const and inlining [...]”。

据说类内初始化只允许用于整数类型(整数、字符、布尔值)并且只允许用于常量。

我只想知道为什么不能在类声明中初始化 double/float。有什么具体原因吗?

class EngineeringConstants {      // this goes in the class
 private:                          // header file
  static const double FUDGE_FACTOR;
  ...
 };
 // this goes in the class implementation file
 const double EngineeringConstants::FUDGE_FACTOR = 1.35;

我只想知道不允许以下声明的原因:

class EngineeringConstants {      // this goes in the class
 private:                          // header file
  static const double FUDGE_FACTOR = 1.35;
  ...
 };

?

4

1 回答 1

18

此语句已过时:在 C++03double中,不支持在类定义中使用 s 进行初始化。在 C++ 中(从 2011 修订版开始),您可以在类定义中初始化任意成员。此外,初始化不仅限于static成员,还可以初始化非static成员:

struct foo {
    static constexpr double value = 1.23;
    std::string   str = "foo";
};

在 C++03 中禁止static使用浮点数初始化成员的历史原因是编译期间的数字可能与执行期间的数字不同。例如,当在使用 IEEE 浮点数的平台上进行交叉编译并针对使用 IBM 十六进制浮点数的平台进行编译时,即使对于可在两个数字系统中表示的常量,也可能会产生不同的结果。

于 2013-09-28T16:14:25.433 回答