сначала std :: remove_reference или std :: remove_cv?

Если я хочу извлечь тип константной ссылки (например, 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

?

14

Решение

использование 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
}

Живая демоверсия.

15

Другие решения

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.

4

По вопросам рекламы [email protected]