2013-06-25 32 views
14

Nếu tôi muốn trích xuất các loại của một tham chiếu const (như tăng gấp đôi từ const double &), làm tôi phải sử dụng:std :: remove_reference hoặc std :: remove_cv trước?

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

hoặc

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

?

Trả lời

15

Sử dụng remove_reference trước tiên. remove_cv chỉ xóa các vòng loại cấp cao nhất và trong trường hợp tham chiếu, không có bất kỳ (hoặc bị bỏ qua).

Một ví dụ cho thấy sự khác biệt:

#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 

vì đầu tiên remove_reference<const double&>::typeconst double, sau đó remove_cv<const double>::typedouble.

Nhưng nếu bạn có C++ 11, hãy xem std::decay.

+7

'std :: decay' = [ 'Unqualified'] (http://flamingdangerzone.com/cxx11/2013/02/ 25/even-more-traits.html # unqualified_types), hai ngữ nghĩa ngụ ý khác nhau. – Xeo

+1

@Xeo Có bạn nói đúng. (Nhưng khi 'T' không phải là một hàm hay mảng (trường hợp của' const double & ') thì' decay :: type' giống với 'remove_cv :: type> :: type'.) (Ngoài ra tôi đã nói "có một cái nhìn tại", không phải "sử dụng thay vì" ^^) –

Các vấn đề liên quan