为什么value_type函数在SGI STL中返回一个指针

时间:2016-12-19 00:54:14

标签: c++ stl

在了解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,我无法弄清楚原因。在我看来,似乎两种解决方案都可以。

希望有人可以帮助我,谢谢!

1 个答案:

答案 0 :(得分:2)

  

我想知道为什么value_type函数必须返回value_type*而不是value_type,我无法弄清楚原因。在我看来,似乎两种解决方案都可以。

请注意uninitialized_fill将该参数取无名称。我们只需要它的类型,并且不想在这里产生任何开销。

对于任意类型T,我们不知道如何构建它,或者它是否可复制或移动。因此直接传递value_type可能是不可能的,并且可能会产生一个完全不需要的副本,其副作用可能是难以忍受的。但我们确实知道我们可以从T*构建0。因此,在这种情况下,使用零初始化指针value_type是一个方便的黑客。

请注意,SGI的实现非常老,甚至早于C ++ 98,因此我建议您查看标准库的更现代的实现。