Estaba leyendo la documentación de std::sub_match<BidirectionalIterator>
y vi que hereda públicamente desde std::pair<BidirectionalIterator, BidirectionalIterator>
. Dado que sub_match
es simplemente un par de iteradores en una secuencia de caracteres, con algunas funciones adicionales, puedo entender que está implementado con un pair
, pero ¿por qué usar herencia pública?¿Por qué std :: sub_match <T> hereda públicamente de std :: pair <T, T>?
El problema con heredar públicamente desde std::pair<T,U>
es lo mismo que heredar públicamente de la mayoría de las otras clases estándar: no están destinados a ser manipulados polimórficamente (en particular, no definen un destructor virtual). Otros miembros tampoco funcionarán correctamente, es decir, el operador de asignación y la función de miembro de intercambio (no copiarán el miembro matched
de sub_match
).
¿Por qué impulsar a los desarrolladores y luego el comité decidió implementar sub_match
heredando públicamente desde pair
en lugar de utilizar la composición (o herencia privada con el uso de declaraciones si querían mantener a sus miembros acceso a través first
y second
)?
Estoy de acuerdo con la asignación dinámica que probablemente nunca debería suceder. Sin embargo, los problemas podrían aparecer con '=' y 'swap'. Estaba pensando en Boost.Range, por ejemplo, pero no requiere que los rangos sean Asignables o Swappable. Sin embargo, es interesante observar que los algoritmos de Boost.Range no aceptan 'sub_match'es como argumentos, pero lo hacen si se manipulan a través de una referencia a un' par' (problemas de clases de rasgos). –