Следующий код не компилировать live on Ideone:Инициализация constexpr с сопзЬ: Different лечение междунар и двойной
#include <iostream>
using namespace std;
int main() {
const double kPi = 3.14;
constexpr double kPi2 = 2.0*kPi;
cout << kPi2;
}
Сообщение об ошибке:
prog.cpp: In function 'int main()': prog.cpp:6:30: error: the value of 'kPi' is not usable in a constant expression constexpr double kPi2 = 2.0*kPi; ^ prog.cpp:5:15: note: 'kPi' was not declared 'constexpr' const double kPi = 3.14;
Подставив const
декларацию для kPi
с constexpr
, it compiles successfully.
С другой стороны, когда int
используется вместо double
, кажется, const
plays well с constexpr
:
#include <iostream>
using namespace std;
int main() {
const int k1 = 10;
constexpr int k2 = 2*k1;
cout << k2 << '\n';
return 0;
}
Почему int
и double
получить различные процедуры для инициализации constexpr
с const
?
Является ли это ошибкой в компиляторе Ideone? Это требуется стандарту C++? Почему это?
Был ли вышеуказанный код UB?
P.S. Я пробовал с компилятором Visual Studio 2015 C++, и он компилирует первый фрагмент кода (инициализация constexpr
с const
) просто отлично.
[выпуск 1826: Const с плавающей точкой в константных выражениях] (http://stackoverflow.com/a/30742473/1708801) охватывает некоторую историю о том, почему с плавающей точкой обрабатывается по-разному. Также [интересное устаревшее gcc exntension] (http://stackoverflow.com/q/32813953/1708801). –
@ShafikYaghmour Спасибо. Я поддержал этот пост. –
Похоже, что комментарий @ ShafikYaghmour должен быть доведен до ответа, а затем принят. – TriskalJM