2013-06-25 6 views
14

Если я хочу, чтобы извлечь тип константной ссылки (например, двойные от сопза двойного &), я должен использовать:std :: remove_reference или std :: remove_cv сперва?

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

или

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

?

ответ

15

Использовать 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 
} 

Live demo.

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

, потому что первый remove_reference<const double&>::type является const double, то это remove_cv<const double>::typedouble.

Но если у вас есть C++ 11, взгляните на std::decay.

+7

'станд :: decay' = [' Unqualified'] (http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html # unqualified_types), эти два подразумевают различную семантику. – Xeo

+1

@Xeo Да, вы правы. (Но когда 'T' не является ни функцией, ни массивом (что было в случае' const double & '), тогда' decay :: type' совпадает с 'remove_cv :: type> :: type'.) (Также я сказал «посмотри», а не «скорее использовать» ^^) –

 Смежные вопросы

  • Нет связанных вопросов^_^