C++ standardowe kontenery i podzielniki zapewnić typedefs dla typu wskaźnik używany przez kontener, tj:typy wskaźnik klienta i kontener/typedefs podzielnika
typename std::vector<T>::pointer
typename std::vector<T>::const_pointer
Rzeczywisty typ wskaźnik używany do tworzenia typedef jest określana poprzez std::allocator_traits
typedef typename std::allocator_traits<Allocator>::pointer pointer;
Ponieważ każdy pojemnik ma również value_type
typedef, przypuszczalnie cel pointer
typedef jest dla jakiejś dziwnej sytuacji, w której wskaźnik typu stosowane jest coś inny niż value_type*
. Nigdy osobiście nie widziałem przypadek użycia czegoś takiego, ale przypuszczam, że komitet standardów chciał zapewnić możliwość korzystania z niestandardowych typów wskaźników z pojemnikami.
Problem polega na tym, że wydaje się to być niespójne z definicjami przewidzianymi dla funkcji w std::allocator_traits
. W szczególności, w std::allocator_traits
mamy funkcję construct
, który jest zdefiniowany jako:
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
... co tylko wywołuje a.construct(p, std::forward<Args>(args)...)
Należy jednak pamiętać, że ta funkcja sprawia żadnych elementów umożliwiających niestandardowego typu wskaźnika. Parametr p
jest zwykłym natywnym wskaźnikiem.
Więc dlaczego nie jest definicja ta funkcja coś takiego:
template <class... Args>
static void construct(Alloc& a, typename Alloc::pointer p, Args&&... args);
Wydaje się bez tego, pojemniki używane std::allocator_traits<Alloc>::construct
zawiedzie, jeżeli są stosowane z podzielnik, który definiuje pewne niestandardowy typ wskaźnika.
Co się tutaj dzieje? A może nie rozumiem celu, jakim jest posiadanie pointer
maszynopisu na pierwszym miejscu?
'Konstrukt' jest/musi być przypięty do elementu * typ *. podobnie z 'destroy'. "allocate" i "dealocate" nie są. Zarówno 'allocate', jak i' dealokacja 'odnoszą się do typu' wskaźnika ', który kontrolujesz. * Żadna z tych funkcji nie dotyczy faktycznego obiektu * konstrukcji * i * zniszczenia *, a zatem nie ma żadnego nakazu przypinania do typu 'T'. Zarówno 'construct' i' destroy', jednak * do *. – WhozCraig
@dyp ':: std :: addressof (* p)', a raczej;) –
Cała idea 'pointer! = Value_type *' wydaje się być (rodzaj) wprowadzona w C++ 11. O ile rozumiem, w C++ 03 implementatorzy kontenerów mogliby przyjmować 'wskaźnik == typ_wartości *'. Obecnie szukam propozycji o tym, dlaczego została zmieniona. Wydaje się, że ma to coś wspólnego z dokumentem koncepcyjnym alokatora (N2654) i potencjalnie z modelem podzielonego zakresu (N2554). – dyp