首先是std :: remove_reference还是std :: remove_cv?

时间:2013-06-25 10:40:21

标签: c++ c++11 reference typetraits qualifiers

如果我想提取const引用的类型(如const double&中的double),我是否必须使用:

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

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

2 个答案:

答案 0 :(得分:15)

首先使用remove_referenceremove_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.

答案 1 :(得分:4)

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

因为第一个remove_reference<const double&>::typeconst double,所以remove_cv<const double>::typedouble

但是如果你有C ++ 11,请查看std::decay