std::remove_reference or std::remove_cv first?
Asked Answered
W

2

19

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

?

Weisbart answered 25/6, 2013 at 10:40 Comment(0)
S
21

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
}

Live demo.

Seldon answered 25/6, 2013 at 10:44 Comment(0)
S
5
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.

Spurry answered 25/6, 2013 at 10:44 Comment(2)
std::decay != Unqualified, the two imply different semantics.Madancy
@Madancy Yes you are right. (But when T is neither a function nor an array (which was the case for const double&) then decay<T>::type is the same as remove_cv<remove_reference<T>::type>::type.) (Also I said "have a look at", not "use rather" ^^)Spurry

© 2022 - 2024 — McMap. All rights reserved.