C ++ 17 Update:
static constexpr
Variablen sind implizit inline
, daher ist keine externe Definition erforderlich.
Ursprüngliche Frage:
Nehmen wir an, ich habe eine Liste von Konstanten wie
%Vor%Dies schlägt natürlich vor, dass ich Definitionen für diese hinzufüge, um ODR-Nutzungsprobleme zu vermeiden, die auftreten können, also brauche ich:
%Vor%Warum sollte Ich bevorzuge das über
%Vor% Was mich vor ODR-Problemen bewahrt, denn N
und M
sind wahrhaftig nur Konstanten und keine eigenständigen Objekte (ein größerer Deal, wenn es sich um Header-Only handelt) und ist kürzer. Ich könnte explizit den Typ enum : long long
oder was auch immer geben, falls erforderlich. Was ist der Vorteil der ersten?
Ein Unterschied besteht darin, dass Sie die Adresse von static constexpr
, nicht aber von enum
verwenden können.
Ein anderer ist, dass constexpr
nicht von älteren Versionen der Sprache unterstützt wird (sie wurde in C ++ 11 eingeführt).
Ich würde enum
nur verwenden, wenn die Werte zusammengehören. Ich würde dem enum
auch einen Namen geben, der diese Beziehung beschreibt. Ich würde nicht enum
für die Definition von nicht verwandten Konstanten verwenden.
Vielleicht kein Vorteil für Ihre Verwendung, weil Sie nur einfache feste Ganzzahlwerte verwenden.
Aber [AFAIK] constexpr
kann allgemeiner sein, da es die Initialisierung von allem erlaubt, was zur Kompilierzeit ausgewertet werden kann.
Von type_traits
:
%Vor%
Somit hat constexpr
eine Verwendung in der Metaprogrammierung.
Das Folgende ist ein bisschen grob.
Wenn Sie eine Funktion wie:
hatten %Vor%Sie finden möglicherweise eine Verwendung wie:
%Vor%Ich bin mir ziemlich sicher, dass ich dafür geflammt werde, aber ...
Der Grund, den ich Ihnen geben würde ist, dass die Verwendung von enum { }
für Konstanten ein Missbrauch des Begriffs enum
ist. Sie zählen nichts auf. Es ist ein häufiger Missbrauch, der gewährt wird. es hat seine praktischen Vorteile; aber es ist einfach falsch. Es sollte eine Möglichkeit geben zu sagen "Dies ist nur eine Kompilierzeitkonstante und nichts anderes". conexpr ist auch nicht das Ding, aber es ist näher als enum. Und es ist zu Recht der Fall, dass Sie Fließkommawerte nicht enumerieren können.
Davon abgesehen - ich benutze häufig Enums für Konstanten.