2013-06-25 12 views
14

Se voglio estrarre il tipo di un riferimento const (come il doppio da const doppia &), devo usare:std :: remove_reference o std :: remove_cv prima?

typename std::remove_cv<typename std::remove_reference<Type>::type>::type 

o

typename std::remove_reference<typename std::remove_cv<Type>::type>::type 

?

risposta

15

Utilizzare prima remove_reference. remove_cv rimuove solo i qualificatori di primo livello e, in caso di riferimenti, non ne esiste (o viene ignorato).

Un esempio che mostra la differenza:

#include <iostream> 
#include <type_traits> 

template<typename T> 
using Remove_cv_ref = std::remove_cv<typename std::remove_reference<T>::type>; 

template<typename T> 
using Remove_ref_cv = std::remove_reference<typename std::remove_cv<T>::type>; 

int main() 
{ 
    std::cout << std::is_same<typename Remove_cv_ref<const int&>::type, int>::value; // 1 
    std::cout << std::is_same<typename Remove_ref_cv<const int&>::type, int>::value; // 0 
} 

Live demo.

4
typename std::remove_cv<typename std::remove_reference<Type>::type>::type 

perché prima remove_reference<const double&>::type è const double, quindi remove_cv<const double>::type è double.

Ma se si dispone di C++ 11, dare un'occhiata a std::decay.

+7

'std :: decay' = [' Unqualified'] (http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html # nonqualified_types), i due implicano una semantica diversa. – Xeo

+1

@Xeo Sì, hai ragione. (Ma quando 'T' non è né una funzione né una matrice (che era il caso di' const double & '), allora 'decadimento :: type' è lo stesso di' remove_cv :: type> :: type'.) (Inoltre ho detto "dai un'occhiata", non "usa piuttosto" ^^) –

Problemi correlati