Внутри заголовочного файла моего класса я пытаюсь сделать следующее и получаю жалобы компилятора:
private:
static const double some_double= 1.0;
Как вы должны это сделать?
Внутри заголовочного файла моего класса я пытаюсь сделать следующее и получаю жалобы компилятора:
private:
static const double some_double= 1.0;
Как вы должны это сделать?
В C++11 у вас могут быть нецелочисленные константные выражения благодаря constexpr
:
private:
static constexpr double some_double = 1.0;
constexpr
делает такого, чего не может const
? Если constexpr
разрешено, почему const
не подразумевает constexpr
? Похоже, что C++ ломает свой собственный исторический дизайн.
- person curiousguy; 09.12.2011
const
не означает constexpr
. constexpr
подразумевает const
. constexpr
строже, чем const
. Учтите, что const auto seed = clock();
, seed
— это константная переменная (ее значение нельзя будет изменить позже), но это не константное выражение (его нельзя было бы использовать для определения размера массива, если бы он был итегральным). constexpr
предназначен для выражения различия между определением времени компиляции и времени выполнения, где const
больше относится к интерфейсу и/или спецификатору привилегий доступа.
- person John; 24.04.2014
constexpr
функции-члены не должны автоматически быть const
, но это исправлено только в C++ 14.
- person Kerrek SB; 24.04.2014
Объявите его в заголовке и инициализируйте в одной единице компиляции (разумно использовать .cpp для класса).
//my_class.hpp
private:
static const double some_double;
//my_class.cpp
const double my_class::some_double = 1.0;
Я работал над этой проблемой, делая следующее:
//my_class.hpp
const double my_double() const {return 0.12345;}
//in use
double some_double = my_class::my_double();
я получил идею от
math::pi()
const double my_double()
Обнять? почему const
?
- person curiousguy; 09.12.2011
const
для значения, возвращаемого функцией, действительно бессмысленно, но в остальном это был надежный вариант до появления constexpr
.
- person underscore_d; 12.08.2016
constexpr
можно использовать так, как показано в ответе KerrekSB, так что теперь это третий способ. :-) - person Cheers and hth. - Alf   schedule 09.12.2011constexpr
, похоже, не помогает, если вы хотите иметь ссылку на статический член (что может быть необходимо при переходе к функции, которая принимает param как const ref) - однако, если вы хотитеconstexpr
и сохраните его в заголовке и иметь возможность ссылаться на него, я думаю, ваш трюк с фиктивным шаблоном (который, если я правильно понял, является просто способом обойти ODR) просто с добавленнымconstexpr
должен сделать это... - person leemes   schedule 02.07.2014