2015-10-10 15 views
18

ho trovato la seguente situazione:miscelazione dichiarazioni constexpr e definizioni const

struct Foo 
{ 
    static constexpr char s[] = "Hello world"; 
}; 

const char Foo::s[]; 

Questo frammento di codice compilato con Clang 3.7 (con -std=c++11 e -std=c++14), ma GCC (4.8, 6.0, stesse impostazioni della lingua) dà la errore mi sarei aspettato:

GCC 4.8:

in.cpp:6:19: error: redeclaration ‘Foo::s’ differs in ‘constexpr’ 
const char Foo::s[]; 
       ^
in.cpp:3:27: error: from previous declaration ‘Foo::s’ 
    static constexpr char s[] = "Hello world"; 
         ^
in.cpp:6:19: error: declaration of ‘constexpr const char Foo::s [12]’ outside of class is not definition [-fpermissive] 
const char Foo::s[]; 

GCC 6.0:

‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive] 

ho trovato this old question che sembra per discutere la miscelazione constexpr e const, ma si concentra su se inizializzatori sono espressioni costanti, piuttosto sull'opportunità definizione e dichiarazione possono differire per quanto riguarda la costanza.

È consentito fornire la definizione per un membro di dati statici constexpr T come const T?

+1

Vedere anche [Perché GCC pensa che la definizione di membro di dati statici di constexpr debba essere contrassegnata come constexpr?] (Http://stackoverflow.com/q/30831567/1708801) –

+0

@ShafikYaghmour: Grazie, interessante. Sembra che il messaggio di errore GCC sia diventato più confuso. In 4.8 è coerente, sebbene contraddica lo standard, ma il nuovo messaggio di errore è piuttosto oscuro. –

risposta

13

Il tuo codice è ben formato. Lo specificatore constexpr non fa parte del tipo ma aggiunge const ([dcl.constexpr]/9), che è presente nella seconda dichiarazione. Sebbene diverse dichiarazioni di una funzione (o modello di funzione) debbano concordare in constexpr -ness come per [dcl.constexpr]/1, non esiste alcuna regola di questo tipo per le dichiarazioni di variabili.

Vedere l'errore #58541, che in pratica utilizza l'esempio.

+1

Grande scoperta, grazie! –