2015-09-28 2 views
7

Ich möchte mit der Migration eines Projekts von gcc zu clang ++ experimentieren. Ich gebe zu Unwissenheit auf meinen Teil, ich bin nicht sicher, warum das folgende Stück CodeConstexpr Kompilierfehler mit clang ++ nicht g ++

template <typename T> 
constexpr T pi{std::acos(T(-1.0))}; 

leise mit g kompiliert ++ aber Klirren ++ erzeugt die Fehler

trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression 
constexpr T pi{std::acos(T(-1.0))}; 

und ich hatte gehofft, dass jemand, der mehr über weiß es als ich könnte mich erleuchten.

NB: Versucht mit -std = C++ 14 und C++ 1y. Unterschlägt Version 3.6.2 (Tags/RELEASE_362/final). Funktioniert mit g ++ (GCC) 5.2.0.

+3

Sieht im Zusammenhang mit [Ist es ein konformes Compiler-Erweiterung zur Behandlung von Nicht-Constexpr-Standard-Bibliotheksfunktionen als Constexpr?] (http://Stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour Ich dachte, ich suchte gut. Ich habe mich geirrt. Vielen Dank. Dies ist in der Tat ein enttäuschendes Ergebnis. Ich bin auch überrascht, dass GCC nicht zumindest eine Warnung ausgibt, wenn es etwas Verbotenes im Standard erlaubt. Ich kompilierte auch mit -pedantisch! Wenn Sie eine Antwort schreiben möchten, werde ich es akzeptieren. – Timtro

+1

Ich bin nicht überrascht, dass die Frage nicht aufkam, scheint die Überschneidung in Keywords minimal. Als ich vor etwa einem Jahr das erste Mal darauf stieß, konnte ich nichts finden und es war nicht, bis ich zufällig in die Ausgabe 2013 der Spracharbeitsgruppe geriet, als es mir gelang, die Teile zusammenzusetzen. –

Antwort

9

Clang ist hier korrekt, wir dürfen acos nicht in einem konstanten Ausdruck verwenden.

Das Problem ist, dass acos nicht im Standard constexpr aber gcc treats some functions not marked in the standard including acos as constexpr markiert ist. Dies ist ein non-conforming extension und sollte schließlich in gcc behoben werden.

Builtin functions oft konstant fach verwendet werden, und wir können sehen, ob wir -fno-builtin mit gcc verwenden deaktiviert es diese nicht konforme Verhalten und wir werden die folgende Fehlermeldung:

error: call to non-constexpr function 'double acos(double)' 
constexpr T pi{std::acos(T(-1.0))}; 
         ^