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
?
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) –
@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. –