dav*_*rne 14 c++ language-lawyer c++11
在std :: vector的API中有一些typedef和许多返回这些typedef的函数.
例如
reference operator[](size_type n);
Run Code Online (Sandbox Code Playgroud)
哪里reference和size_type是typedef.
有一个typedef pointer,它从它的allocator模板参数中获取.为什么函数签名是data()这样的:
T* data() noexcept;
Run Code Online (Sandbox Code Playgroud)
而不是:
pointer data() noexcept;
Run Code Online (Sandbox Code Playgroud)
这背后有什么理由吗?也是为什么它T*而不是value_type*.
如果你想检查它是我所拥有的标准的第23.3.6.4节.
Jon*_*ely 21
data()存在的原因是获取指向向量内部的基础数组的指针,以便(例如)您可以将其传递给使用指针而非迭代器的API.
该pointer类型定义不一定是真正的指针类型,它是一个typedef std::allocator_traits<allocator_type>::pointer这可能是某个类类型的行为就像一个指针(有时称为"看中指针").
对于默认情况,std::vector<T>是std::vector<T, std::allocator<T>>,和std::allocator_traits<std::allocator<T>>::pointer它的类型相同T*,所以没有区别.
但是对于std::vector<T, CustomAllocator<T>>if data()返回a,pointer你将无法将它传递给期望a T*除非is_same<pointer, T*>::value为真的函数.