Nachdem Sie mithilfe von mathematischen Konstanten für die Erhöhung in constexpr geantwortet haben und vorgeschlagen haben, dass die Boost-Funktion von boost für eine Variable constexpr
anstelle von verwendet wird Die non-templated Konstante, um einen Clang-Fehler zu unterdrücken, entschied ich mich zu versuchen, zu sehen, welche Bedingungen den Fehler im clang reproduzieren würden. Versuchen wir zu kopieren, welches Boost-Makro erweitert wird:
Das gibt die folgenden Fehler (folgen Sie Coliru )
%Vor% Das ist in Ordnung, wir haben das erwartet. Ändern Sie nun double
in int
:
Kein Fehler? Unnötig zu sagen, dass ich verwirrt bin. Ich nahm an, der Fehler war, weil die Variable als const
statt constexpr
definiert ist, es sei denn, ich verpasse etwas. Werfen wir einen Blick auf cppreference :
Eine consExpr-Variable muss die folgenden Anforderungen erfüllen:
- es muss sofort konstruiert oder ein Wert zugewiesen werden.
- Die Konstruktorparameter oder der Wert, der zugewiesen werden soll, dürfen nur Literalwerte, Contexpr Variablen und Funktionen enthalten.
Wenn wir dies wörtlich interpretieren würden, dann ist clang berechtigt, einen Fehler zu geben, weil name
nur const
, nicht constexpr
ist. Und anscheinend double
ist ein LiteralType
weil:
gibt 1
aus. Warum klingelt der Klang nicht mehr, wenn name
ist int
und nicht% double
?
S.S .: Kann nicht auf gcc reproduziert werden.
Zur Klarstellung ist das static
-Schlüsselwort orthogonal zum Problem. So ist namespace
. Soweit ich weiß, umschließt das Boost-Makro die Variable static const
nicht in einer Klasse, sondern in namespace
. Ich habe es auf diese vier Fälle beschränkt:
Ich kann unmöglich belästigt werden, static
in jeder möglichen Permutation anzuwenden, um zu sehen, ob es einen Unterschied macht, aber ich bezweifle es.
Es ist kein Fehler. Leider hat der C ++ - Standard verschiedene statische / nicht-statische const-Regeln für Gleitkommatypen und Integertypen. Bitte sehen Sie:
Warum sind statische const floats nicht erlaubt?
Versuchen Sie constexpr anstelle von const wie in:
%Vor%und:
%Vor%Dann sollte es funktionieren.