Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?
-
Ich lese gerade im Standard, da wird dann der Header zu std::vector angegeben, und da wird value_type = T, reference = value_type& usw. definiert. Jetzt steht da aber auch z.B.:
T* data() noexcept; const T* data() const noexcept; void push_back(const T& x); // usw.
Wieso verwendet man nicht gleich z.B.
void push_back(const_reference x);
wenn man die alle schon extra definiert hat? Oder ist der Sinn nur, dass man außerhalb auf diese Typen zugreifen kann? Und verwendet man nur z.B. size_type, weil dessen Wert "implementation-defined" ist, const_reference jedoch klar definiert ist?
-
@harteware sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Wieso verwendet man nicht gleich z.B.
Weil es mehr zu schreiben ist und weil man außerdem bei einer Definition der Funktion außerhalb der Klasse dann
template<typename T> void vector<T>::push_back(vector<T>::const_reference value) {}
statt einfach nur
template<typename T> void vector<T>::push_back(T const & value) {}
schreiben müsste.
@harteware sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Oder ist der Sinn nur, dass man außerhalb auf diese Typen zugreifen kann?
Ja.
@harteware sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Und verwendet man nur z.B. size_type, weil dessen Wert "implementation-defined" ist, const_reference jedoch klar definiert ist?
Diese Frage leider ist leider technitschlitsch unverständlitsch.
-
@harteware Es ist eine Anforderung an Container-Klassen, dass diese Typen definiert sind. Warum deine Implementierung diese Aliase nicht verwendet kann ich nur vermuten. Möglicherweise wurde es als einfacher zu schreiben und besser lesbar empfunden - immerhin macht es keinen Unterschied, welchen Namen man verwendet wenn diese alle denselben Typen repräsentieren. Interessant wäre eventuell noch, sich auch mal std::vector<bool> deiner Implementierung anzuschauen. Hier sollte eigentlich mindestens std::vector<bool>::reference kein Alias für bool& sein.
Nachtrag: Hatte überlesen, dass das so im Standard steht, damit bezieht sich alles was ich oben zur "deiner Implementierung" gesagt habe natürlich auf den Standard.
@harteware sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Und verwendet man nur z.B. size_type, weil dessen Wert "implementation-defined" ist, const_reference jedoch klar definiert ist?
Innerhalb von std::vector<T> (für T != bool) kann man natürlich schamlos davon ausgehen (klar definiert, wie du schreibst), dass z.B. std::vector<T>::reference dasselbe wie T& ist. Außerhalb, z.B. wenn man einen Algorithmus für beliebige Container implementiert, darf man das natürlich nicht mehr. Hier sollte man dann std::vector<T>::reference verwenden.
-
OK danke ich glaube ich habe den Sinn dieser ganzen using-Deklarationen jetzt einigermaßen verstanden.
-
@finnegan sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Hier sollte man dann std::vector<T>::reference verwenden.
Bzw.
Container::reference
- wenn man schon generischen Code schreibt, dann gleich ordentlich und nicht unnötigerweise aufvector
einschränken.
-
@hustbaer sagte in Verständnisfrage zum C++ Standard: Wieso verwendet man nicht value_type, reference, pointer etc. in der Implementierung?:
Bzw.
Container::reference
- wenn man schon generischen Code schreibt, dann gleich ordentlich und nicht unnötigerweise aufvector
einschränken.War auch gemeint. Danke für den Hinweis.