Почему указатель typedef не используется в std::vector:: data()?

В API std::vector есть некоторые typedef и многие функции, которые возвращают эти typedefs.

например.

reference operator[](size_type n);

Где reference и size_type являются typedefs.

Существует typedef из pointer, из которого он получает из него аргумент шаблона распределителя. Почему подпись функции data() выглядит следующим образом:

T* data() noexcept;

Вместо

pointer data() noexcept;

Есть ли какие-то соображения? Кроме того, почему это T*, а не value_type*.

Если вы хотите проверить, что это раздел 23.3.6.4 стандарта, который у меня есть.

Ответы

Ответ 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 не является истинным.