18.3.2.1/2:
specializzazioni membri essere fornito per ogni tipo aritmetico, sia in virgola mobile che intero, compreso il bool. Il membro è_specializzato deve essere vero per tutte le specializzazioni di numeric_limits.
Quindi sappiamo che esistono specializzazioni per questi tipi non di riferimento. Quindi 18.3.2.3/1:
Il modello numeric_limits predefinito deve avere tutti i membri, ma con 0 o valori falsi.
ho il sospetto che è stato fatto in questo modo, perché si può sempre static_assert su is_specialized
per forzare un errore di compilazione, ma ci potrebbe essere qualche applicazione modello in cui 0 sarebbe un valore predefinito ok per uno o più dei limiti. Se si desidera essere in grado di testare i riferimenti, basta eseguirlo tramite std::remove_reference
.
Non sono sicuro che sia legale specializzare numeric_limits
per i propri tipi. Lo standard in 18.3.2.1/4 dice:
tipi
non aritmetiche standard, come complessi (26.4.2), non devono avere specializzazioni.
Personalmente leggo questo qute come "lo standard non fornirà specializzazioni per i tipi di libray standard non aritmetici, ma è perfettamente legale specializzarsi per un tipo di utente". Si potrebbe facilmente leggere questo come vietando totalmente qualsiasi specializzazione non fornita.
fonte
2015-04-01 14:31:44
'std :: numeric_limits' non è specializzato su quel tipo, quindi è 0 per impostazione predefinita. – 0x499602D2
dal punto di vista della progettazione linguistica, il valore predefinito non dovrebbe essere un errore di compilazione? –
Nessun motivo specifico: si limitano a fare in modo che i tipi di riferimento abbiano gli stessi valori in 'numeric_limits' in quanto il non riferimento richiede uno sforzo aggiuntivo e nessuno ha pensato di renderlo conveniente per te. Puoi 'std :: remove_reference :: type' se questo ti riguarda. –
milleniumbug