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?
risposta
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_signed
può 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.
Puoi specializzarti ' std :: numeric_limits
@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. –
@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
- 1. std: numeric_limits <double> :: epsilon definition
- 2. std :: is_signed non funziona per le enumerazioni fortemente tipizzati: int
- 3. Come utilizzare l'espressione del generatore CMake $ <TARGET_FILE: tgt>?
- 4. std :: cin.ignore (std :: numeric_limits <std :: streamsize> :: max(), '\ n') errore quando si utilizza #include <Windows.h>
- 5. Differenza tra std :: set e std :: priority_queue
- 6. Differenza tra std: string e std :: string
- 7. Differenza tra std :: uninitialized_copy e std :: copy?
- 8. Differenza tra std :: logical_not e std :: not1?
- 9. Qual è la differenza tra std :: to_string, boost :: to_string e boost :: lexical_cast <std::string>?
- 10. Qual è la differenza tra std :: multimap <key, value> e std :: map <chiave, std :: set <value>>
- 11. std :: vector <std::string> crash
- 12. Perché std :: cout << principale << std :: endl stampa 1?
- 13. Differenza tra std :: eccezione e "..."
- 14. Differenza tra inizializzazioni stringstream.str (a_value) e stringstream << a_value
- 15. C++ std :: stringstream operatore << sovraccarico
- 16. Clang, std :: shared_ptr e std :: meno/operatore <
- 17. Differenza tra std :: regex_match & std :: regex_search?
- 18. Ordinamento di std :: vector <std :: pair <std :: string, bool >> per la stringa?
- 19. Differenza tra <? Php e <?
- 20. Come convertire std :: vector <std :: reference_wrapper <T>> a std :: vector <T>
- 21. Confronto std :: function <>
- 22. Perché non sono presenti `std :: uniform_int_distribution <uint8_t>` e `std :: uniform_int_distribution <int8_t>` Consentito?
- 23. Qual è la differenza tra std :: partial_sum e std :: inclusive_scan?
- 24. Qual è la differenza tra std :: movimento e std :: avanti
- 25. Qual è la differenza tra std :: transform e std :: for_each?
- 26. Differenza tra std :: vector e std :: array di inizializzazione elenca
- 27. Qual è la differenza tra std :: cout e std :: wcout?
- 28. Qual è la differenza tra std :: function e std :: mem_fn
- 29. Perché non esiste un operatore << per std :: unique_ptr?
- 30. differenza tra <> e =
'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
Beh, in pratica useresti 'std :: is_signed :: value' nella pratica. Dove utilizzeresti 'std :: is_signed ' direttamente? –
Ma i loro risultati sono mai diversi? – smilingthax