Ответ 1
Причина data()
существует, чтобы получить указатель на базовый массив внутри вектора, так что (например) вы можете передать его API-интерфейсам, которые работают с указателями, а не итераторами.
pointer
typedef не обязательно является реальным типом указателя, это 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>>
, если data()
возвращен pointer
, вы не сможете передать его функции, ожидающей T*
, если только is_same<pointer, T*>::value
не является истинным.