Il seguente codice utilizza il membro enum m
come espressione costante, ovvero come parametro del modello. Il codice viene compilato in gcc ma non in clang (live demo). Clang dice "errore: l'argomento modello non di tipo non è un'espressione costante".Uso di un enum come espressione costante. Quale compilatore ha ragione?
Il problema può essere risolto scambiando la linea // 1
entro il A<tst<p>::m> a
. Pertanto, la mia domanda non è come risolvere questo problema, ma quale compilatore ha ragione.
template<size_t n> struct A{};
template<size_t n>
struct tst
{ enum : size_t { m= n % 15 };
template<size_t p>
void
call(tst<p> const &t2) {
A<t2.m> a; // 1
}
};
[Questi riferimenti dicono] (http://en.cppreference.com/w/cpp/language/enum) "Quando un'enumerazione senza ambito è un membro della classe, è possibile accedere ai relativi enumeratori utilizzando gli operatori di accesso dei membri della classe' .' e '->' ". Tuttavia non parla di essere espressioni costanti. –
@JoachimPileborg Lo standard '§ 7.2.2' dice 'Gli identificatori in un elenco di enumeratori sono dichiarati come costanti e possono apparire ovunque siano richieste costanti. – lcs