为什么std :: vector :: data()中没有使用指针typedef?

时间:2015-07-23 10:47:47

标签: c++ c++11 language-lawyer

在std :: vector的API中有一些typedef和许多返回这些typedef的函数。

e.g。

reference operator[](size_type n);

其中referencesize_type是typedef。

它有一个pointer的typedef,它来自它的分配器模板参数。为什么data()的函数签名是这样的:

T* data() noexcept;

而不是:

pointer data() noexcept;

这背后有什么理由吗?另外,为什么T*而不是value_type*

如果你想检查它是我所拥有的标准的第23.3.6.4节。

1 个答案:

答案 0 :(得分:21)

data()存在的原因是获取指向向量内部的基础数组的指针,以便(例如)可以将其传递给使用指针而非迭代器的API。

pointer typedef不一定是真正的指针类型,它是std::allocator_traits<allocator_type>::pointer的typedef,它可以是某种行为类似指针的类型(有时称为“花式指针”)。 / p>

对于默认情况,std::vector<T>std::vector<T, std::allocator<T>>std::allocator_traits<std::allocator<T>>::pointerT*的类型相同,因此没有区别。

但是对于std::vector<T, CustomAllocator<T>>如果data()返回pointer,您将无法将其传递给期望T*的函数,除非is_same<pointer, T*>::value为真。