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

Vin*_*ent 16 c++ reference qualifiers type-traits c++11

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

typename std::remove_cv<typename std::remove_reference<Type>::type>::type
Run Code Online (Sandbox Code Playgroud)

要么

typename std::remove_reference<typename std::remove_cv<Type>::type>::type
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 18

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
}
Run Code Online (Sandbox Code Playgroud)

现场演示.


gx_*_*gx_ 5

typename std::remove_cv<typename std::remove_reference<Type>::type>::type
Run Code Online (Sandbox Code Playgroud)

因为首先remove_reference<const double&>::typeconst double,然后remove_cv<const double>::typedouble

但是,如果您具有C ++ 11,请参阅std::decay

  • `std :: decay`!= [`Unqualified`](http://flamingdangerzone.com/cxx11/2013/02/25/even-more-traits.html#unqualified_types),这两个语义不同。 (7认同)
  • @Xeo 是的,你是对的。(但是当 `T` 既不是函数也不是数组时(`const double&amp;` 就是这种情况),那么 `decay&lt;T&gt;::type` 与 `remove_cv&lt;remove_reference&lt;T&gt;::type&gt; 相同: :type`。)(我也说“看看”,而不是“使用”^^) (2认同)