这是代码:
template <class _Iter>
inline typename iterator_traits<_Iter>::value_type*
__value_type(const _Iter&)
{
return static_cast<typename iterator_traits<_Iter>::value_type*>(0);
}
该函数重新编号_Iter的value_type *。
这是const _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;
};
const _Tp *的局部特征是必要的吗?如果我们调用
__value_type(const _Iter&)
我们致电
iterator_traits<_Iter>
实际上没有const。
iterator_traits<const _Iter>
永远不会发生。
答案 0 :(得分: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*
的尝试:没有标准库专业化用户代码专门为{ {1}}编译正常但行为未定义。