clang 3.5 constexpr Inkonsistenz - Fehler bei Verwendung von double, aber nicht int

8

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:

%Vor%

Das gibt die folgenden Fehler (folgen Sie Coliru )

%Vor%

Das ist in Ordnung, wir haben das erwartet. Ändern Sie nun double in int :

%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Community 10.02.2014, 23:36
quelle

1 Antwort

6

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.

    
coder 11.02.2014, 03:23
quelle

Tags und Links