Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Статическая константа

#cpp


Можно ли объявить с инициализацией static переменную типа double/float и производных
внутри класса? 

Если да, то каким способом? Если нет, то почему?
    


Ответы

Ответ 1



Вы можете создавать константные статически члены класса со спецификатором constexpr и инициализировать их внутри определения класса. Например #include struct 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

Комментариев нет:

Отправить комментарий