Warum sollte ich den statischen consExpr int in einer Klasse über enum für Integritätskonstanten auf Klassenebene bevorzugen?

8

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?

    
Ryan Haining 04.02.2016, 22:42
quelle

3 Antworten

3

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.

    
emlai 04.02.2016 23:02
quelle
2

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%     
Craig Estey 04.02.2016 23:20
quelle
1

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.

    
einpoklum 22.03.2016 22:02
quelle

Tags und Links