Por ejemplo, std::vector<int&> vec_int;
esto parece ser inválido en C++. ¿Por qué es esto inválido?¿Por qué no puedo usar tipos de referencia como el tipo de valor de un tipo de contenedor?
Respuesta
Responda, según la solicitud de chryspi anterior. Como se comentó en otras respuestas, no puede usar referencias directamente ya que las referencias no existen por sí mismas.
Puede utilizar referencias, sin embargo, pero utilizando la clase boost::reference_wrapper<T>
utilidad:
typedef boost::reference_wrapper<int> intref;
std::vector<intref> v;
int i;
i = 9;
v.push_back (boost::ref (i)); // store &i
int& j = v[0];
j = 10;
//v[0].get() = 10;
std::cout << i << std::endl; // prints 10
me puso como ejemplo la forma de modificar directamente el elemento v[0]
. Tenga en cuenta que es algo complicado (debe llamar al método get()
) porque obtiene un boost::reference_wrapper<T>
en lugar de una referencia real.
Para almacenar punteros de manera segura con respecto a la memoria, puede utilizar boost::shared_ptr
de manera similar.
Los contenedores STL deben ser capaces de construir objetos con el constructor predeterminado. No puedes hacer eso con una referencia. Se garantiza que una referencia es válida, por lo tanto, siempre debe inicializarse con asignación.
Necesita usar un puntero en su lugar.
Hay otra razón. Las referencias no pueden ser asignadas. Creo que ':: std :: vector' requiere que la cosa almacenada en él sea asignable. – Omnifarious
Dos notas aquí. También se puede usar 'boost :: ref' para almacenar referencias en contenedores. Y sobre los punteros, también 'boost :: shared_ptr' para almacenarlos con seguridad wrt. asignación de memoria. –
La asignación es probablemente el culpable aquí. AFAIK, los contenedores no requieren un constructor por defecto, a menos que llame a los métodos que lo usan (por ejemplo 'resize()' con el valor predeterminado y similar). – visitor
Internamente, un vector<T>
utiliza una matriz para almacenar una secuencia de objetos T
. Como las referencias no son objetos, no existe una matriz de referencias (véase 8.3.2 §5 en el estándar), por lo que los tipos de referencia no se pueden utilizar para parametrizar la plantilla vector
.
Lo que probablemente desee es un vector de punteros inteligentes como std::vector<boost::shared_ptr<T> >
o un contenedor de puntero dedicado como boost::ptr_vector<T>
.
- 1. C# - Contenedor de referencia para el tipo de valor
- 2. ¿Puede un tipo ser un tipo de referencia y un tipo de valor al mismo tiempo?
- 3. ¿Por qué no podemos bloquear un tipo de valor?
- 4. ¿Se puede usar un tipo de referencia como tipo de clave en un mapa STL?
- 5. Convierta el tipo de referencia C# al tipo de referencia no por correspondencia
- 6. ¿Por qué System.Enum no es un tipo de valor?
- 7. Genéricos C#: tipo de referencia vs. valor
- 8. ¿Por qué no puedo usar un argumento de tipo en un parámetro de tipo con múltiples límites?
- 9. tipo de valor tipo de objeto de referencia en javascript
- 10. Especifique el valor predeterminado para un tipo de referencia
- 11. ¿Por qué BeginInvoke no devuelve la referencia de tipo AsyncResult?
- 12. ¿Puede AutoMapper Map entre un tipo de valor (Enum) y un tipo de referencia? (Cadena)
- 13. Tipo de referencia no puede encontrar el tipo público llamado
- 14. ¿Qué pasar? ¿Objeto de referencia o tipo de valor?
- 15. ¿Por qué es el 'esto' no de palabras clave de un tipo de referencia en C++
- 16. ¿Se puede usar una clase abstracta como tipo de referencia?
- 17. ¿Por qué son tipos de referencia de punteros?
- 18. ¿Por qué Math.Floor (Double) devuelve un valor de tipo Double?
- 19. tipo no tiene null como un valor adecuado
- 20. ¿Por qué usar el tipo de trabajo anónimo y usar un tipo explícito no en un GroupBy?
- 21. ¿Es posible crear un método genérico de C# que acepte el tipo de valor (anulable) y el tipo de referencia?
- 22. cómo obtener el valor predeterminado de un tipo si el tipo solo se conoce como Tipo de sistema?
- 23. C# - ¿Por qué no puedo pasar una clase declarada en una instrucción using como un tipo de referencia?
- 24. ¿Cómo puedo determinar el tipo de referencia bendecida en Perl?
- 25. ¿Por qué hay interfaces en tipos de referencia .Net?
- 26. Dado el valor de algún tipo de ruta dependiente, ¿cómo puedo obtener una instancia del "contenedor"?
- 27. Tipo de valor Vs Tipo de referencia - Clase de objeto C#
- 28. ¿Almacenar una referencia a un tipo de valor?
- 29. ¿Se considera Guid un tipo de valor o un tipo de referencia?
- 30. C# - Método de valor del tipo de valor: ¿por qué el compilador utiliza la reflexión?
debe cambiar el nombre a este "¿Por qué no puedo utilizar" ... – Philipp