2013-03-09 11 views
5

Entrambi std::is_signed<T> e std::numeric_limits<T>::is_signed devono fornire risposte sulla firma di T.
Perché ora ci sono due indicatori per la firma (ad esempio da C++ 11)?Differenza tra std :: is_signed <T> e std :: numeric_limits <T> :: is_signed?

+4

'std :: is_signed ' è un tipo, mentre il membro 'std :: numeric_limits :: is_signed' è solo un valore. Nella meta-programmazione, avere il primo è molto più conveniente ed è anche più coerente. – Xeo

+1

Beh, in pratica useresti 'std :: is_signed :: value' nella pratica. Dove utilizzeresti 'std :: is_signed ' direttamente? –

+0

Ma i loro risultati sono mai diversi? – smilingthax

risposta

7

Ho intenzione di azzardare un'ipotesi che l'unica differenza è se std::numeric_limits<T> è specializzato per un tipo definito dall'utente. Un tipo così definito dall'utente potrebbe ovviamente fornire il proprio valore per is_signed. Tuttavia, la richiesta di std::is_signed<T>::value su questo tipo restituirà sempre false a meno che lo std::is_signed<T> non sia specializzato in modo indipendente.

Sembra come se la condizione che std::is_signed<T> rappresenta è

is_arithmetic<T>::value && T(-1) < T(0) 

Aggiornamento: Il sempre-informato Howard Hinnant points out che mentre std::numeric_limits<> può essere legalmente specializzato, nulla in <type_traits> è consentito essere specializzato se non diversamente specificato, e is_signed non è specificato come specializzabile.

Pertanto, std::numeric_limits<T>::is_signedpuò ritorno true per un tipo definito dall'utente (se è stata specializzata), ma std::is_signed<T>::value sarà sempre tornare false per i tipi definiti dall'utente.

+0

Puoi specializzarti ' std :: numeric_limits 'per un tipo definito dall'utente? In C++ 03 era illegale per l'utente aggiungere qualcosa allo spazio dei nomi 'std'. Questa restrizione è stata revocata per C++ 11? –

+0

@DavidHammen: No, la restrizione è presente, ma non si applica alle specializzazioni. Ti è consentito specializzare i modelli esistenti in 'std', non puoi semplicemente aggiungere le tue cose. –

+0

@DavidHammen: È sempre stato legale specializzare completamente i modelli nello spazio dei nomi 'std', non solo per specializzare parzialmente i modelli di classe o le funzioni di sovraccarico/i modelli di funzioni. – ildjarn

Problemi correlati