2015-09-28 26 views
7

Voglio sperimentare la migrazione di un progetto da gcc a clang ++. Ammetto l'ignoranza da parte mia, io non sono sicuro perché il seguente pezzo di codiceErrore di compilazione di Constexpr con clang ++ not g ++

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

compila in silenzio con g ++ ma clang ++ genera l'errore

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

e speravo qualcuno che sa di più su quello di me potrebbe illuminarmi.

NB: Provato con -std = C++ 14 e C++ 1y. Errore in clang versione 3.6.2 (tag/RELEASE_362/final). Funziona con g ++ (GCC) 5.2.0.

+3

Sembra correlate a [E 'una conforme estensione del compilatore per trattare le funzioni della libreria standard di non-constexpr come constexpr?] (http://stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour Pensavo di aver cercato bene. Mi sbagliavo. Grazie. Questo è davvero un risultato deludente. Sono anche sorpreso che GCC non emetta almeno un avvertimento quando consentirà qualcosa di proibito nello standard. Stavo compilando anche -pedantic! Se vuoi scrivere una risposta, la accetterò. – Timtro

+1

Non sono sorpreso che la domanda non sia venuta, la sovrapposizione nelle parole chiave sembra minima. Quando mi sono imbattuto per la prima volta circa un anno fa non sono riuscito a trovare nulla e non è stato fino a quando non mi sono imbattuto accidentalmente nel numero del gruppo di lavoro linguistico 2013 quando sono riuscito a mettere insieme i pezzi. –

risposta

9

Clang è corretto qui, non è consentito utilizzare acos in un'espressione costante.

Il problema è che acos non è contrassegnato come constexpr nello standard ma gcc treats some functions not marked in the standard including acos as constexpr. Questo è un non-conforming extension e dovrebbe essere corretto in gcc.

Builtin functions sono spesso utilizzati per costante volte e possiamo vedere se usiamo -fno-builtin con gcc si disabilita questa non conforme comportamento e ci riceverà il seguente errore:

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