在了解SGI STL的迭代器特征时遇到了问题。
这是一个获取迭代器类型的函数。
template <class Iterator>
inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&){
return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
这是一个调用value_type
template <class ForwardIterator, class T>
inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x){
__uninitialized_fill(first,last,x,value_type(first));
}
template <class ForwardIterator, class T, class T1>
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*){
typedef typename __type_traits<T1>::is_POD_type is_POD;
__uninitialized_fill_aux(first, last, x, is_POD());
}
我想知道为什么value_type
函数必须返回value_type*
而不是value_type
,我无法弄清楚原因。在我看来,似乎两种解决方案都可以。
希望有人可以帮助我,谢谢!
答案 0 :(得分:2)
我想知道为什么
value_type
函数必须返回value_type*
而不是value_type
,我无法弄清楚原因。在我看来,似乎两种解决方案都可以。
请注意uninitialized_fill
将该参数取无名称。我们只需要它的类型,并且不想在这里产生任何开销。
对于任意类型T
,我们不知道如何构建它,或者它是否可复制或移动。因此直接传递value_type
可能是不可能的,并且可能会产生一个完全不需要的副本,其副作用可能是难以忍受的。但我们确实知道我们可以从T*
构建0
。因此,在这种情况下,使用零初始化指针value_type
是一个方便的黑客。
请注意,SGI的实现非常老,甚至早于C ++ 98,因此我建议您查看标准库的更现代的实现。