Сначала std::remove_reference или std::remove_cv?
Если я хочу извлечь тип ссылки на const (например, double из const double&), мне нужно использовать:
typename std::remove_cv<typename std::remove_reference<Type>::type>::type
или же
typename std::remove_reference<typename std::remove_cv<Type>::type>::type
?
2 ответа
Решение
Использование 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
}
typename std::remove_cv<typename std::remove_reference<Type>::type>::type
потому что сначала remove_reference<const double&>::type
является const double
, затем remove_cv<const double>::type
является double
,
Но если у вас есть C++11, посмотрите на std::decay
,