是在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>
永远不会发生。
答
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*
这个类模板将汇编确定,但具有不确定的行为。
C++标准没有强制任何特定的实现。这不是关于C++的问题,而是关于您的供应商的问题。 –
如果'_Iter'是'const char *'(例如)那么是的,你将使用这种特殊化。 (这是一个指向const的指针,而不是一个常量指针) – immibis
@KerrekSB我明白了,谢谢! – stonecutter