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.
'std :: decay' = [' Unqualified'] (http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html # nonqualified_types), i due implicano una semantica diversa. – Xeo
@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" ^^) –