2013-06-25 4 views
14

私は(constのダブル&から、二重のような)const参照の種類を抽出したい場合は、私が使用する必要があります:std :: remove_referenceまたはstd :: remove_cv first?

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は次にremove_cv<const double>::typedoubleで、const doubleからです。

しかし、C++ 11をお持ちの場合は、std::decayをご覧ください。

+7

'のstd :: decay' = [' Unqualified'(http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html#unqualified_types)、この2つは異なるセマンティクスを暗示します。 – Xeo

+1

@ Xeoはい、あなたは正しいです。 (しかし、 'T'が関数でも配列でもないとき(' const double 'の場合) 'decay :: type'は' remove_cv :: type> :: type'と同じです。 )(また、私は "見て"、 "むしろ"使用していないと言った^^) –

関連する問題