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

dav*_*rne 14 c++ language-lawyer c++11

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

例如

reference operator[](size_type n);
Run Code Online (Sandbox Code Playgroud)

哪里referencesize_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为真的函数.

  • 另见LWG问题[1312](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1312)(这是改变的地方) (5认同)
  • 是的,虽然它不仅仅是C的互操作性.有C++ API也可以处理原始指针. (5认同)