2013-03-13 12 views
11

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"?

+0

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

risposta

8

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.

+1

Ho un modello di funzione di tipo 'foo (T &)', e spara :( –

+0

@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 <>'). –

+0

In 'foo (T &)' un qualificatore su 'T' non è di primo livello,' & 'è il livello più alto, e ogni qualificatore cv è" one level down " –

Problemi correlati