Najpierw użyj remove_reference
. remove_cv
usuwa tylko kwalifikatory najwyższego poziomu, aw przypadku odniesień nie ma żadnych (lub jest ignorowanych).
Przykładem, który przedstawia różnicę!
#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 # unqualified_types), dwa implikują inną semantykę. – Xeo
@Xeo Tak, masz rację. (Ale gdy 'T' nie jest ani funkcją, ani tablicą (co było w przypadku' const double & ') to' zepsucie :: type' jest takie samo jak 'remove_cv :: type> :: type'.) (Powiedziałem też "spójrz na", a nie "używaj raczej" ^^) –