是在stl_iterator_base.h在必要

问题描述:

这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

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*这个类模板将汇编确定,但具有不确定的行为。