Il seguente programma viene compilato senza errori o avvertimento con gcc 4.8.1, -Wall -std=c++11
:gcc non è in grado di diagnosticare il restringimento delle conversioni negli argomenti modello non di tipo?
template<unsigned N>
struct A{};
int main(){
A<1-2> a;
(void)a;
return 0;
}
clang 3.3 con le stesse opzioni dà questo errore:
error: non-type template argument evaluates to -1, which cannot be narrowed to type 'unsigned int' [-Wc++11-narrowing]
Come per this question, sembra come la presente politica di gcc solo per dare avvertimenti per il restringimento delle conversioni in cui lo standard indica errori e dove clang dà gli errori indicati. Ma in questo caso gcc non dà nemmeno un avvertimento.
Nessuno degli esempi di restringimento errori di conversione che vengono dati dal standard al § 8.5.4/7 (riprodotto in that question) copre il caso di una conversione restringimento di un argomento di template non tipo, ma a § 14.3.2/5 standard dice:
For a non-type template-parameter of integral or enumeration type, conversions permitted in a con- verted constant expression (5.19) are applied.
e § 5.19/3 dice:
A converted constant expression of type T is a literal constant expression, implicitly converted to type T, where the implicit conversion (if any) is permitted in a literal constant expression and the implicit conversion sequence contains only user-defined conversions, lvalue-to-rvalue conversions (4.1), integral promotions (4.5), and integral conversions (4.7) other than narrowing conversions (8.5.4)
(il corsivo è mio).
Questo mi sembra significare che anche con il proprio metro di valutazione gcc è in errore non diagnosticare affatto una conversione di restringimento in questo caso. Leggo bene? C'è un controargomento basato sullo standard ?
Sto facendo la domanda con più sentimento che semplice curiosità. In un ambiente TMP ricorsiva , l'errore di clang diagnostico in questo caso sarà individuare un bug in cui un non-modello tipo di argomento unsigned cade attraverso 0, mentre tutti si ottiene da gcc è "modello di profondità massima di un'istanza superato".
Lo standard mai "inviti a presentare errori" o per avvisi - lo standard richiede solo un'implementazione di emettere una diagnosi * *. Se tale diagnostica prende la forma di un errore del compilatore o di un avvertimento o qualcosa di completamente diverso da entrambi, non rientra nell'ambito dello standard. – Casey
@Casey. Capisco, ma sto mettendo in dubbio l'assenza di * qualsiasi * diagnosi; l'assenza di altro che il successo. –
@Casey. No, mi scuso. Ho detto "gli errori richiesti" e non avrei dovuto. –