Zwykle warunek instrukcja if jest oceniana w czasie wykonywania.
Rozważ jednak przypadek, w którym warunek jest wyrażeniem stałym, tak jak w poniższym przykładzie:
#include <iostream>
int main()
{
constexpr double gravity{ 9.8 };
// reminder: low-precision floating point literals of the same type can be tested for equality
if (gravity == 9.8) // constant expression, always true
std::cout << "Gravity is normal.\n"; // will always be executed
else
std::cout << "We are not on Earth.\n"; // will never be executed
return 0;
}Ponieważ gravity jest constexpr i inicjalizowany jest wartością 9.8, warunek gravity == 9.8 musi mieć wartość true. W rezultacie instrukcja else nigdy nie zostanie wykonana.
Ocenianie warunku constexpr w czasie wykonywania jest marnotrawstwem (ponieważ wynik nigdy się nie zmieni). Marnotrawstwem jest także kompilowanie kodu do pliku wykonywalnego, którego nigdy nie można wykonać.
Constexpr if instrukcje C++17
C++17 wprowadza constexpr if instrukcję, która wymaga, aby warunek był wyrażeniem stałym. Warunek instrukcji constexpr-if zostanie oceniony w czasie kompilacji.
Jeśli wynik instrukcji warunkowej constexpr ma wartość true, cała instrukcja if-else zostanie zastąpiona instrukcją true. Jeśli wartość warunkowa constexpr ma wartość false, cała instrukcja if-else zostanie zastąpiona instrukcją false (jeśli istnieje) lub niczym (jeśli nie ma innej).
Aby użyć instrukcji constexpr-if, dodajemy słowo kluczowe constexpr po if:
#include <iostream>
int main()
{
constexpr double gravity{ 9.8 };
if constexpr (gravity == 9.8) // now using constexpr if
std::cout << "Gravity is normal.\n";
else
std::cout << "We are not on Earth.\n";
return 0;
}Gdy powyższy kod zostanie skompilowany, kompilator oceni warunek w czasie kompilacji, zobacz to tak jest zawsze true i zachowuje tylko pojedynczą instrukcję std::cout << "Gravity is normal.\n";.
Innymi słowy, skompiluje to tak:
int main()
{
constexpr double gravity{ 9.8 };
std::cout << "Gravity is normal.\n";
return 0;
}Najlepsza praktyka
Preferuj instrukcje constexpr if zamiast instrukcji non-constexpr if, gdy warunek jest wyrażeniem stałym.
Nowoczesne kompilatory i instrukcje if z warunkami warunkowymi constexpr C++17
W celach optymalizacji nowoczesne kompilatory zazwyczaj traktują wyrażenia inne niż constexpr instrukcje if, które zawierają warunki warunkowe constexpr tak, jakby były instrukcjami constexpr-if. Jednakże nie jest to wymagane.
Kompilator, który napotka instrukcję if inną niż constexpr z warunkiem constexpr, może wyświetlić ostrzeżenie zalecające użycie zamiast tego instrukcji if constexpr . Zapewni to wykonanie oceny w czasie kompilacji (nawet jeśli optymalizacje są wyłączone).

