#cpp
Можно ли объявить с инициализацией static переменную типа double/float и производных внутри класса? Если да, то каким способом? Если нет, то почему?
Ответы
Ответ 1
Вы можете создавать константные статически члены класса со спецификатором constexpr и инициализировать их внутри определения класса. Например #includestruct A { static constexpr double d = 10.15; }; constexpr double A::d; int main() { A a; std::cout << a.d << std::endl; return 0; } Ранее этого нельзя было делать, так как тип double разными компиляторами представлялся по-разному и более того было расхождение между препроцессорами и компиляторами, как они представляют тип double. Вот, что, например, пишет Страуструп в своем предложении по включению в стандарт спецификатора constexpr: Traditionally, evaluation of floating-point constant expression at compile-time is a thorny issue. Ответ 2
Нельзя было до C++11. Такое можно было делать только с "integral types" (integers, chars, bools). Используя constexpr такое можно делать и для других типов. C++11 standard, 9.4.2 Static data members If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment- expression is a constant expression (5.19). A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-уxpression is a constant expression
Комментариев нет:
Отправить комментарий