In C++ bestaan er compile-time (constantheid tijdens compilatie) en link-time (tijdens koppelingsfase) constantheid.
const variabele is een object dat niet kan worden gewijzigd na initialisatie. Maar const garandeert niet altijd dat de waarde bekend is tijdens de compilatie; deze kan alleen tijdens runtime worden berekend.constexpr garandeert dat de expressie of functie al tijdens de compilatie wordt berekend.Voorbeeld:
const int x = time(0); // const, maar NIET constexpr: waarde wordt berekend tijdens runtime constexpr int y = 2 + 2; // constexpr: bekend tijdens compilatie constexpr int square(int x) { return x * x; } int arr[square(3)]; // grootte van de array — expressie van compile-tijd
Gebruik constexpr voor constante expressies die toegankelijk moeten zijn voor de compiler, bijvoorbeeld voor de groottes van een array of sjabloonparameters.
Kan een functie die als constexpr is gedeclareerd, worden aangeroepen met niet-constante argumenten?
Antwoord: Ja! Als de argumenten bekend zijn tijdens de compilatie, zal het resultaat worden berekend tijdens de compilatie. Als de argumenten alleen tijdens runtime bekend zijn, zal de functie worden berekend zoals een gewone.
constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Wordt aangeroepen tijdens runtime
Verhaal
Een van de modules stelde de grootte van een array in via
const int, in de veronderstelling dat dit een constante van compile-tijd was. Op een andere compiler leidde dit tot een fout, omdat de waarde werd berekend tijdens runtime en de grootte van de array niet conforme was.
Verhaal
Bij het berekenen van hashes kon de compiler de berekeningen niet optimaliseren, omdat een
constvariabele werd gebruikt en nietconstexpr. Resultaat: prestatievermindering van meer dan 2 keer in nieuwe releases.
Verhaal
Bij de migratie naar moderne standaarden werden de trefwoorden verwisseld en werd de functie als
constverklaard in plaats vanconstexpr, waardoor het resultaat niet kon worden gebruikt in compile-time expressies van sjablonen. Snelle diagnostiek onthulde de fout, maar tijdens de beoordeling werd deze naar master doorgestuurd.