Std:: remove_reference или std:: remove_cv? - программирование
Подтвердить что ты не робот

Std:: remove_reference или std:: remove_cv?

Если я хочу извлечь тип ссылки const (например, double from const double &), мне нужно использовать:

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

или

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

?

4b9b3361

Ответ 1

Сначала используйте remove_reference. remove_cv удаляет только квалификаторы верхнего уровня, а в случае ссылок нет (или игнорируется).

Пример, который показывает разницу:

#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
}

Демо-версия.

Ответ 2

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

потому что сначала remove_reference<const double&>::type есть const double, тогда remove_cv<const double>::type есть double.

Но если у вас есть С++ 11, посмотрите std::decay.