[C++14: 7.1.5/1]:
L'identificatoreconstexpr
deve essere applicato solo alla definizione di un modello variabile o variabile, alla dichiarazione di un modello funzione o funzione o alla dichiarazione di un membro dati statici di tipo letterale (3.9). Se una dichiarazione di una funzione, modello di funzione o modello variabile ha un identificatoreconstexpr
, tutte le sue dichiarazioni devono contenere l'identificatoreconstexpr
. [..]Perché GCC pensa che la definizione di membro di dati statici di constexpr debba essere contrassegnata come constexpr?
Si noti che la seconda frase non menziona "un membro di dati static" il modo in cui la prima frase fa, quindi non c'è alcun obbligo in questo passaggio che tutte le dichiarazioni (e qui sto considerando specificamente una dichiarazione) di un membro di dati ha l'identificatore constexpr
.
Non riesco a trovare una regola altrove per autorizzare questo.
Perché, quindi, GCC rifiuta il seguente programma?
#include <chrono>
using namespace std::chrono_literals;
#define DUR 1000ms
struct T
{
static constexpr auto dur_1 = DUR;
};
decltype(T::dur_1) T::dur_1;
// main.cpp:12:23: error: 'constexpr' needed for in-class initialization of static data member 'const std::chrono::duration<long int, std::ratio<1l, 1000l> T::dur_1' of non-integral type [-fpermissive]
// decltype(T::dur_1) T::dur_1;
// ^
Anche la parte relativa a "modelli variabili" è scomparsa nelle bozze recenti. - Modifica: ah, questo è http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1712 – dyp
La taglia sembra andare invano! – anshabhi
@anshabhi: Tristemente :( –