2015-07-23 14 views
14

W interfejsie API std :: vector istnieje kilka typedefs i wiele funkcji, które zwracają te typedefs.Dlaczego wskaźnik typedef nie jest używany w std :: vector :: data()?

np.

reference operator[](size_type n); 

Gdzie reference i size_type są typedefs.

Istnieje typedef z pointer, który pobiera z argumentu szablonu alokatora. tam

pointer data() noexcept; 

pewne Rozumowanie to: dlaczego jest podpis funkcją data() tak:

T* data() noexcept; 

Zamiast? Dlaczego nie jest to T*, a nie value_type*.

Jeśli chcesz to sprawdzić, to sekcja 23.3.6.4 standardu, który mam.

Odpowiedz

21

Powodem, dla którego istnieje data(), jest dostarczenie wskaźnika do podstawowej tablicy wewnątrz wektora, aby (na przykład) można było przekazać ją do interfejsów API współpracujących ze wskaźnikami, a nie z iteratorami.

Typedef nie musi być prawdziwym typem wskaźnika, jest typedef dla std::allocator_traits<allocator_type>::pointer, który może być typem klasy, który zachowuje się jak wskaźnik (czasami nazywany "fantazyjnym wskaźnikiem").

Dla przypadku domyślnym std::vector<T> jest std::vector<T, std::allocator<T>> i std::allocator_traits<std::allocator<T>>::pointer jest tego samego typu jak T*, więc to nie ma znaczenia.

Ale std::vector<T, CustomAllocator<T>> jeśli data() zwrócił pointer nie byłby w stanie przekazać go do funkcji spodziewa się T* chyba is_same<pointer, T*>::value jest prawdą.

+5

Zobacz także LWG wydanie [1312] (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1312) (gdzie to się zmieniło) – hlt

+1

Widzę , ponieważ interoperacyjność C, w której się znajduje, zostałaby zerwana, gdyby zwracała "wskaźnik". Ponieważ jest to powód funkcji, ma to sens. Dzięki. – davidcorne

+5

Racja, chociaż to nie tylko interoperacyjność C. Istnieją interfejsy C++, które również obsługują surowe wskaźniki. –

Powiązane problemy