2013-06-25 9 views
14

Wenn ich den Typ eines konstante Referenz extrahieren möchten (wie Doppel von const double &), muss ich verwenden:std :: remove_reference oder std :: remove_cv zuerst?

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

oder

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

?

Antwort

15

Zuerst remove_reference verwenden. remove_cv entfernt nur Qualifikationsmerkmale der obersten Ebene und im Falle von Referenzen gibt es keine (oder wird ignoriert).

Ein Beispiel, das den Unterschied zeigt:

#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 

weil erste remove_reference<const double&>::typeconst double ist, dann ist remove_cv<const double>::typedouble. Wenn Sie C++ 11 haben, schauen Sie sich std::decay an.

+7

'std :: decay' = [' Unqualified'] (http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html # unqualified_types), implizieren die beiden unterschiedliche Semantiken. – Xeo

+1

@Xeo Ja, Sie haben Recht. (Aber wenn 'T 'weder eine Funktion noch ein Array ist (was bei' const double & 'der Fall war), ist' case :: type' dasselbe wie 'remove_cv :: type> :: type'.) (Auch ich sagte "schau es dir an", nicht "benutze lieber" ^^) –

Verwandte Themen