2015-12-02 16 views
0

這STL常量_TP *的局部特化是代碼:是在stl_iterator_base.h在必要

template <class _Iter> 
inline typename iterator_traits<_Iter>::value_type* 
__value_type(const _Iter&) 
{ 
    return static_cast<typename iterator_traits<_Iter>::value_type*>(0); 
} 

reutrn _Iter的VALUE_TYPE *的函數。

這是常量的局部特化_TP *

template <class _Tp> 
struct iterator_traits<const _Tp*> { 
typedef random_access_iterator_tag iterator_category; 
    typedef _Tp       value_type; 
    typedef ptrdiff_t     difference_type; 
    typedef const _Tp*     pointer; 
    typedef const _Tp&     reference; 

};

是常量_TP的部分特化*必要?如果我們調用

__value_type(const _Iter&) 

我們實際調用

iterator_traits<_Iter> 

沒有常量。

iterator_traits<const _Iter> 

永遠不會發生。

+0

C++標準沒有強制任何特定的實現。這不是關於C++的問題,而是關於您的供應商的問題。 –

+0

如果'_Iter'是'const char *'(例如)那麼是的,你將使用這種特殊化。 (這是一個指向const的指針,而不是一個常量指針) – immibis

+0

@KerrekSB我明白了,謝謝! – stonecutter

回答

0

std::iterator_traits<T>的其中一個用途是確定算法中的value_type。當使用T const*作爲迭代器類型時,需要專業化。 value_type是指針的const-不合格版本。實施可能選擇使用

template <typename T> 
struct iterator_traits<T*> { 
    using value_type = std::remove_cv_t<T>; 
    // ... 
}; 

,而不是專門針對T const*

使用專業化的T const*有可能診斷[非法]嘗試從用戶,專門用於一般T const*整潔的效果:沒有標準庫專業化的用戶代碼,專門爲T const*這個類模板將彙編確定,但具有不確定的行爲。