12

Herb Shutter の「Exceptional C++」、「Item 1 : #define or const and inlining [...]」を読んでいます。

クラス内の初期化は、整数型 (integers、chars、bools) および定数に対してのみ許可されていると言われています。

クラス宣言で 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++03 ではdouble、クラス定義で s を使用した初期化はサポートされていませんでした。C++ (2011 リビジョン以降) では、クラス定義で任意のメンバーを初期化できます。また、初期化はメンバーに限定されませんが、非メンバーstaticも初期化できます。static

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

C++03 で浮動小数点数を使用してメンバーの初期化を禁止する歴史的な理由staticは、コンパイル中の数値が実行中の数値と異なる可能性があるためです。たとえば、IEEE 浮動小数点を使用するプラットフォームでクロス コンパイルし、IBM 16 進浮動小数点数を使用するプラットフォームをターゲットにすると、両方の数値システムで表現可能な定数に対しても異なる結果が得られる可能性があります。

于 2013-09-28T16:14:25.433 に答える