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)
typename std::remove_cv<typename std::remove_reference<Type>::type>::type
Run Code Online (Sandbox Code Playgroud)
因为首先remove_reference<const double&>::type是const double,然后remove_cv<const double>::type是double。
但是,如果您具有C ++ 11,请参阅std::decay。