Czytałem dokumentację std::sub_match<BidirectionalIterator>
i widziałem, że publicznie dziedziczy po std::pair<BidirectionalIterator, BidirectionalIterator>
. Ponieważ sub_match
jest po prostu parą iteratorów w sekwencji znaków, z kilkoma dodatkowymi funkcjami, mogę zrozumieć, że jest on implementowany z pair
, ale po co używać publicznego dziedziczenia?Dlaczego std :: sub_match <T> publicznie dziedziczy ze std :: pair <T, T>?
Problem z dziedziczeniem publicznie z std::pair<T,U>
jest taki sam, jak dziedziczenie publicznie z większości innych klas standardowych: nie mają one na celu zmanipulowania polimorficznego (w szczególności nie definiują wirtualnego destruktora). Inni członkowie również nie będą działać poprawnie, a mianowicie operator przypisania i funkcja członka zamiany (nie będą kopiować członka matched
z sub_match
).
Dlaczego Zwiększ deweloperów, a następnie komisja zdecydowała się na wdrożenie sub_match
przez dziedziczenie publicznie od pair
zamiast stosowania kompozycji (lub prywatnym dziedziczenie z użyciem deklaracji, jeśli chcieli zachować dostęp użytkownika poprzez first
i second
)?
Zgadzam się na przydzielanie dynamiczne, które prawdopodobnie nigdy nie powinno się zdarzyć. Jednak problemy mogą nadal występować z '=' i 'swap'. Myślałem o Boost.Range na przykład, ale nie wymaga zakresów do przypisania lub zamiany. Warto jednak zauważyć, że algorytmy Boost.Range nie akceptują argumentów "sub_match'es", ale robią to, jeśli są manipulowane przez odniesienie do 'pair' (problemów z klasami cech). –