2015-09-28 34 views
7

Chcę eksperymentować z migracją projektu z gcc do clang ++. Przyznam ignorancja z mojej strony, nie jestem pewien, dlaczego następujący fragment koduBłąd kompilacji Constexpr z clang ++ nie g ++

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

kompiluje cicho z g ++ ale dzyń ++ produkuje błąd

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

i miałem nadzieję, że ktoś, kto wie więcej o to niż ja mogłem oświecić mnie.

NB: Próbowałem z -std = C++ 14 i C++ 1y. Brak wersji klang 3.6.2 (tagi/RELEASE_362/final). Działa z g ++ (GCC) 5.2.0.

+3

Wygląda związane [Czy to jest zgodne rozszerzenie kompilatora do traktowania standardowych funkcji biblioteki non-constexpr jako constexpr?] (http://stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour Myślałem, że przeszukałem dobrze. Myliłem się. Dziękuję Ci. To naprawdę rozczarowujący wynik. Jestem również zaskoczony, że GCC nie emituje co najmniej ostrzeżenia, gdy zezwala na coś zabronionego w standardzie. Kompilowałem też z opcją -pedantic! Jeśli chcesz napisać odpowiedź, zaakceptuję ją. – Timtro

+1

Nie dziwię się, że pytanie nie pojawiło się, nakładanie słów kluczowych wydaje się minimalne. Kiedy pierwszy raz wpadłem na to około rok temu, nie mogłem nic znaleźć i to nie było, dopóki przypadkiem nie wpadłem na problem z językiem grupy roboczej 2013, kiedy udało mi się połączyć te elementy. –

Odpowiedz

9

Clang jest tutaj poprawny, nie możemy używać acos w wyrażeniu stałym.

Problem polega na tym, że acos nie jest oznaczony jako constexpr w standardzie, ale gcc treats some functions not marked in the standard including acos as constexpr. Jest to non-conforming extension i powinien ostatecznie zostać naprawiony w gcc.

Builtin functions są często wykorzystywane do stałej krotnie i możemy zobaczyć, czy używamy -fno-builtin z gcc to wyłącza tę niezgodnych zachowanie i otrzymamy następujący błąd:

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