Poniższy kod nie skompilować live on Ideone:Inicjowanie constexpr z const: różne traktowanie int i double
#include <iostream>
using namespace std;
int main() {
const double kPi = 3.14;
constexpr double kPi2 = 2.0*kPi;
cout << kPi2;
}
Komunikat o błędzie jest:
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;
Podstawiając deklarację const
dla kPi
z constexpr
, it compiles successfully.
Z drugiej strony, gdy int
jest używany zamiast double
, wydaje się const
plays well z constexpr
:
#include <iostream>
using namespace std;
int main() {
const int k1 = 10;
constexpr int k2 = 2*k1;
cout << k2 << '\n';
return 0;
}
Dlaczego int
i double
uzyskać różne zabiegi dla inicjalizacji constexpr
z const
?
Czy jest to błąd w kompilatorze Ideone? Czy jest to wymagane przez standard C++? Dlaczego?
Czy powyższy kod był UB?
P.S. Próbowałem z kompilatorem Visual Studio 2015 C++ i kompilował pierwszy fragment kodu (inicjowanie constexpr
z const
).
[Wydanie 1826: const zmiennoprzecinkowych w stałych wyrażeniach] (http://stackoverflow.com/a/30742473/1708801) obejmuje część historii, dlaczego zmiennoprzecinkowe jest traktowane inaczej. Również [interesujący przestarzały dodatek gcc] (http://stackoverflow.com/q/32813953/1708801). –
@ShafikYaghmour Dzięki. Przegłosowałem ten post. –
Wygląda na to, że komentarz @ ShafikYaghmour powinien być promowany do odpowiedzi, a następnie zaakceptowany. – TriskalJM