Leo B. schrieb:
> Ich gebe zu, ich sehe solch ein Konstrukt zum ersten mal, aber gibt es
> hierfür nicht das gute alte #define?
> Nur weil das alt ist, ist es ja nicht schlecht?!
Präprozessor-Makros haben diverse Nachteile, aber leider werden sie
immernoch unnötigerweise oft für Dinge wie Integer-Konstanten verwendet.
Makros sind eine dumme Textersetzung, die subtilere Dinge der Sprache
wie Typen und Scopes völlig außer Acht lässt. Hat man einmal ein Makro
definiert, kann man diesen Namen nie wieder im Projekt verwenden, auch
nicht in inneren Scopes wie Funktionen. Macht man es versehentlich doch,
weil man den Überblich über alle seine Macros sowie die aller
eingebundener Libraries nicht hat, gibt es skurrile Fehlermeldungen.
Verwendet man Konstanten oder wie hier eine Funktion, passiert das
nicht. Außerdem haben Konstanten/Funktionen immer einen Typ; eine
Konstante die ein "int" zurückgibt kann nie versehentlich einem "char*"
zugewiesen werden. Ein Makro mit dem Wert 0 schon. Bei
Funktionsoverloads oder Templates denen eine Konstante übergeben wird
ist der Typ immer klar; bei Makros passiert es leicht dass der falsche
verwendet wird.
In diesem Kontext hier hat die constexpr-Funktion noch einen anderen
Vorteil: Man kann damit (rekursiv) Algorithmen schreiben, die vom
Compiler berechnet werden, um die tatsächliche Zahl zu berechnen. Mit
Makros geht das nicht.
Da C++ im Gegensatz zu C richtige Konstanten hat, kann man hier zur
Definition von Zahlen komplett auf Makros verzichten und sollte es aus
o.g. Gründen auch.
In C sind die meisten Compiler (wie GCC) auch schlau genug "static
const" Variablen wegzuoptimieren, wenn man sie zur Definition von
Konstanten verwendet, und daher kann (und sollte) sie hier auch
verwenden.