Reputation: 60481
If I want to extract the type of a const reference (like double from const double&), do I have to use :
typename std::remove_cv<typename std::remove_reference<Type>::type>::type
or
typename std::remove_reference<typename std::remove_cv<Type>::type>::type
?
Upvotes: 19
Views: 3694
Reputation: 55425
Use remove_reference
first. remove_cv
removes top level qualifiers only and in case of references, there isn't any (or is ignored).
An example that shows the difference:
#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
}
Upvotes: 21
Reputation: 4770
typename std::remove_cv<typename std::remove_reference<Type>::type>::type
because first remove_reference<const double&>::type
is const double
, then remove_cv<const double>::type
is double
.
But if you have C++11, have a look at std::decay
.
Upvotes: 5