Come visto su http://en.cppreference.com/w/cpp/memory/pointer_traits e siti correlati (anche l'implementazione boost di boost invadente), pointer_traits
non è specializzato per T*const
. Perché?Perché pointer_traits non è definito per "T * const"?
risposta
Anche se questo non si qualifica come una forte motivazione contro specificando che una specializzazione di pointer_traits<>
per T* const
dovrebbe esistere, immagino una spiegazione perché non è stato incluso potrebbe essere che pointer_traits<>
è in gran parte destinato a essere utilizzato in un contesto in cui si verifica la deduzione dell'argomento modello (e in particolare la deduzione di tipo).
Dal tipo di deduzione non tiene conto di alto livello CV-qualifiche, una specializzazione per T* const
o T* volatile
o T* const volatile
era probabilmente ritenuto superfluo:
#include <type_traits>
template<typename T>
void foo(T)
{
static_assert(std::is_same<T, int*>::value, "Error"); // Does not fire!
// ^^^^
}
int main()
{
int x = 0;
int* const p = &x;
foo(p);
}
Naturalmente questo non vuol dire che avere una specializzazione per T* cv
avrebbe danneggiato in questo scenario, volevo solo fornire una possibile spiegazione del perché mancano quelle specializzazioni.
Analogamente, nessuna specializzazione di iterator_traits<>
viene fornita per T* cv
.
Ho un modello di funzione di tipo 'foo (T &)', e spara :( –
@Johannes: Sì, questa è una situazione in cui i qualificatori di cv di primo livello non vengono ignorati. Giusto per chiarire, ho solo provato a dare un possibile spiegazione del perché la specializzazione non c'è, non sto sostenendo che * non dovrebbe * esserci (in effetti, le implementazioni sembrano fornirlo per 'shared_ptr <>'). –
In 'foo (T &)' un qualificatore su 'T' non è di primo livello,' & 'è il livello più alto, e ogni qualificatore cv è" one level down " –
- 1. Differenza tra `T &` e `const T &` per tutti-const class
- 2. Perché è consentito T() = T()?
- 3. Perché Element.prototype non è definito?
- 4. Perché JSONObject.length non è definito?
- 5. Qualche idea per cui QHash e QMap restituiscono const T invece di const T &?
- 6. Perché IEnumerable <T> è definito come IEnumerable <out T>, non IEnumerable <T>
- 7. const unificante T & e T && sovraccarica
- 8. Perché è consentito "const true = false"?
- 9. Perché ricevo ReferrenceError: BinaryFile non è definito
- 10. In Backbone this.model non è definito, perché?
- 11. Perché questo comportamento non definito è?
- 12. perché socket.id non è definito nel browser
- 13. Perché x non è definito nell'ambito interno?
- 14. Ignora su! T() per T-D definito utilizzato in D?
- 15. Perché event.namespace non è definito per l'evento click?
- 16. VS2013 - static const già definito
- 17. Perché non c'è to_string (const string &)?
- 18. Se `this` non è const, perché non posso modificarlo?
- 19. Perché questa dichiarazione const const const valido
- 20. Perché auto_ptr <T> ha operatore!() Definito?
- 21. Perché "t instanceof T" non è ammesso dove T è un parametro di tipo e t è una variabile?
- 22. Perché il comportamento non definito mySet.erase (it ++) non è definito o è?
- 23. abstractmethod non è definito
- 24. Timedelta non è definito
- 25. req.headers.origin non è definito
- 26. Perché il progetto Emacs C-c p non è definito?
- 27. Conversione da "foo <T>" a "foo const <const T>" - C++
- 28. `const T * restrict` garantisce che l'oggetto puntato non venga modificato?
- 29. window.googleapis non è definito
- 30. Jasmine: Perché non essere definito e non definito?
Direi perché si applica alla variabile in cui si memorizza il puntatore, non all'entità del puntatore logico stesso. Non ha importanza per le proprietà/caratteristiche di un puntatore come lo memorizzi. – PlasmaHH