Почему double не допускается в инициализаторе внутри класса

Я читал "Исключительный С++" от Herb Shutter, "Item 1: #define или const и inlining [...]".

Говорят, что инициализация в классе допускается только для целых типов (целые числа, символы, 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;
  ...
 };

?

Ответ 1

Эта инструкция устарела: в С++ 03 инициализация с использованием double в определении класса не поддерживалась. В С++ (начиная с версии 2011) вы можете инициализировать произвольные элементы в определении класса. Кроме того, инициализация не ограничивается членами static, но вы также можете инициализировать членов static:

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

Историческая причина запретить инициализацию членов static, использующих числа с плавающей запятой в С++ 03, заключалась в том, что число во время компиляции может отличаться от числа во время выполнения. Например, когда кросс-компиляция на платформе с использованием плавающих точек IEEE и таргетинг на платформу с использованием шестнадцатеричных поплавков IBM может давать разные результаты даже для констант, представляемых как в числовых системах.