Wymagania dotyczące kontenerów zostały zmienione z C ++ 03 na C ++ 11. Podczas gdy C ++ 03 miał ogólne wymagania (np. Kopiowalność konstruowalności i przypisywalność dla wektora), C ++ 11 definiuje szczegółowe wymagania dotyczące każdej operacji kontenera (sekcja 23.2).
W rezultacie możesz np. Przechowywać w wektorze typ, który można kopiować, ale nie można go przypisać - na przykład strukturę ze stałym składnikiem - o ile wykonujesz tylko określone operacje, które nie wymagają przypisania (konstrukcja i push_back
są takimi operacjami ; insert
nie).
Zastanawiam się: czy to oznacza, że teraz pozwala na to standard vector<const T>
? Nie widzę żadnego powodu, dla którego nie powinien - const T
podobnie jak struktura ze składową stałą jest typem, który można kopiować, ale nie można go przypisać - ale być może coś przeoczyłem.
(Część tego, co sprawia, że myślę, że mogłem coś przeoczyć, jest to, że bagażnik gcc ulega awarii i pali się, jeśli próbujesz utworzyć instancję vector<const T>
, ale jest w porządku, gdy vector<T>
T ma element const).
address
funkcji składowych w domyślnym alokatorze: gdy T jest stała, te dwa przeciążenia mają ten sam podpis. Łatwym sposobem naprawienia tego byłoby wyspecjalizowanie sięstd::allocator<const T>
i usunięcie jednego z przeciążeń.