在std :: vector的API中有一些typedef和许多返回这些typedef的函数。
e.g。
reference operator[](size_type n);
其中reference
和size_type
是typedef。
它有一个pointer
的typedef,它来自它的分配器模板参数。为什么data()
的函数签名是这样的:
T* data() noexcept;
而不是:
pointer data() noexcept;
这背后有什么理由吗?另外,为什么T*
而不是value_type*
。
如果你想检查它是我所拥有的标准的第23.3.6.4节。
答案 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>>::pointer
与T*
的类型相同,因此没有区别。
但是对于std::vector<T, CustomAllocator<T>>
如果data()
返回pointer
,您将无法将其传递给期望T*
的函数,除非is_same<pointer, T*>::value
为真。