ho cercato di trasmettere-dichiarare una mascherina constexpr
variabile in questo modo:Forward dichiarare un modello variabile constexpr
template<typename>
constexpr std::size_t iterator_category_value;
L'obiettivo era quello di documentare che ogni specializzazione dovrebbe essere constexpr
, ma devo ammettere che non ho mai controllato se era legale o no e g ++ ne era felice. Tuttavia, quando ho provato a compilare questo Spinnet con clangore ++, invece, ho ottenuto il seguente errore:
error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long') constexpr std::size_t iterator_category_value; ^ = 0
L'errore ha un senso, e la rimozione constexpr
fa scomparire, così che non è un problema reale. Tuttavia, sono curioso ora: lo standard consente una tale dichiarazione anticipata constexpr
per un modello variabile o è illegale? g ++ e clang ++ sembrano essere in disaccordo e mi piacerebbe sapere dove dovrei inviare una segnalazione di bug, se necessario.
Entrambi si lamentano per una variabile dichiarata inoltrata constepxr
che non è un modello variabile, quindi il contesto del modello variabile sembra essere ciò che rende i compilatori in disaccordo.
Il testo di http://wg21.cmeerw.net/cwg/issue1712 implica che non è possibile inoltrarlo come "constexpr", tuttavia non sono sicuro di come lo std lo proibisca. Un modello variabile non mi sembra una * dichiarazione oggetto *. – dyp
OTOH, [dcl.dcl] p9 sembra molto generico e dovrebbe applicarsi ai modelli variabili (=> i modelli variabili sono dichiarazioni oggetto => 'constexpr' richiede l'inizializzazione) – dyp
@dyp Btw., Cosa intendi con" ora "? Non stai compilando le fonti più aggiornate attualmente disponibili su Git? – Columbo