Creo que parte del problema proviene de la suposición de que los colocadores son útiles. Asignadores (al menos 11 ++ pre-C) were something of a late addition to the STL:
La gente quería contenedores independientes del modelo de memoria, que era algo excesivo porque el lenguaje no incluye los modelos de memoria. La gente quería que la biblioteca proporcionara algún mecanismo para abstraer los modelos de memoria. Las versiones anteriores de STL suponían que el tamaño del contenedor se puede expresar como un número entero del tipo size_t
y que la distancia entre dos iteradores es del tipo ptrdiff_t
. Y ahora nos dijeron, ¿por qué no abstraen de eso? Es una tarea difícil porque el lenguaje no se abstrae de eso; Las matrices C y C++ no están parametrizadas por estos tipos. Inventamos un mecanismo llamado "asignador", que encapsula información sobre el modelo de memoria. Eso causó graves consecuencias para cada componente de la biblioteca. Tal vez se pregunte qué tienen que ver los modelos de memoria con los algoritmos o las interfaces de contenedor. Si no puede usar cosas como size_t
, tampoco puede usar cosas como T*
debido a diferentes tipos de punteros (T*
, T huge *
, etc.). Entonces no puede usar referencias porque con diferentes modelos de memoria tiene diferentes tipos de referencia. Hubo tremendas ramificaciones en la biblioteca.
Desafortunadamente, they turned out to be substandard:
he inventado asignadores para hacer frente a la arquitectura de memoria de Intel. No son ideas tan malas en teoría, ya que tienen una capa que encapsula todo el material de la memoria: punteros, referencias, ptrdiff_t
, size_t
. Lamentablemente no pueden funcionar en la práctica. Por ejemplo,
vector<int, alloc1> a(...);
vector<int, alloc2> b(...);
no se puede decir ahora:
find(a.begin(), a.end(), b[1]);
b[1]
devuelve un alloc2::reference
y no int&
. Podría ser un error de tipo. Es necesario cambiar la forma en que el lenguaje central trata las referencias para hacer que los asignadores sean realmente útiles.
El typedef reference
está destinado a devolver cualquiera que sea el equivalente de T&
es para el asignador de que se trate. En las arquitecturas modernas, esto es probablemente T&
. Sin embargo, se suponía que en algunas arquitecturas podría ser algo diferente (por ejemplo, un compilador dirigido a una arquitectura con punteros "cercanos" y "lejanos" podría necesitar una sintaxis especial para referencias "cercanas" y "lejanas"). Lamentablemente, esta brillante idea resultó ser menos que brillante. C++ 11 realiza cambios sustanciales en los asignadores, agregando asignadores de alcance, y el modelo de memoria. Tengo que admitir que no sé lo suficiente sobre los cambios de C++ 11 w.r.t. asignadores para decir si las cosas mejoran o empeoran.
En cuanto a los comentarios sobre la pregunta original, ya que el estándar en realidad no especifica cómo se deben implementar los contenedores (aunque la Norma no poner tantos requisitos sobre el comportamiento de los contenedores que puede ser que también. ..), cualquiera que sea el tipo que digas como reference
debe tener los comportamientos de T&
que alguien podría potencialmente confiar al implementar el contenedor: un objeto de tipo reference
debe ser un alias transparente para el objeto original, asignándole debe cambiar el valor de el objeto original sin cortar, no hay necesidad de apoyar "volver a colocar" el reference
, tomando la dirección del reference
debe devolver la dirección del o objeto riginal, etc. De ser posible, debería ser T&
; y el único caso que puedo imaginar donde no sería posible sería si estuviera asignando memoria que no podría manipular a través de punteros o referencias (por ejemplo, si la "memoria" estaba realmente en el disco, o si la memoria era en realidad asignado en una computadora separada y accesible a través de la red a través de llamadas RPC, etc.).
No creo que nadie esté entendiendo esta pregunta. Él pregunta qué tipo de comportamientos se denominan "referencias". No es el tipo de referencia C++ (como 'int &'). –
Pensándolo bien, no creo entender ahora la Q. El tipo 'reference' o' const_reference' se comporta como una referencia normal o la referencia de referencia se comporta, ¿Por qué crees que debería comportarse de manera diferente? –
@ Alls: La pregunta, literalmente, es: ¿Qué significa "se comporta como una referencia normal"? Es una oración vaga en sí misma, así que no sé qué condiciones tendría que cumplir antes de que mi tipo "se comporte como una referencia normal" (si estuviera haciendo un contenedor, por ejemplo). – Mehrdad