2012-05-10 15 views
7

¿Es solo mi compilador o está prohibido usar contras referencias en los elementos de std :: vector. Considere la siguiente estructura:Referencias de Const en std :: elementos vectoriales

struct Y 
{ 
    const int & x; 

    Y(const int & p_x): 
     x(p_x) 
    { 
    } 
}; 

Ahora, cuando intento para empujar dicho objeto en vector:

std::vector<Y> yv; 
int x = 5; 
Y y(x); 
yv.push_back(y); 

me sale error del compilador: "error: miembro de referencia no estático` const int & Y :: x ', no puede usar el operador de asignación predeterminado ". ¿No debería ser suficiente copiar el ctor?

Respuesta

19

Los elementos vector deben ser asignables. Desde la sección plantilla de vectores 23.2.4 Clase del estándar de C++:

...the stored object shall meet the requirements of Assignable.

+2

+1 para citar el estándar :) – Nobody

4

No, porque no se puede asignar a una referencia constante y los contenedores STL hacen uso de la asignación para mover elementos.

Será mejor que utilice un shared_ptr (boost:: o std:: dependiendo de su entorno) o un puntero sin formato.

1

Es necesario un operador de asignación porque vector construye por defecto elementos en ranuras adicionales antes de tiempo.

Más tarde, en lugar de reasignar, utiliza el operador de asignación para asignar esas instancias predeterminadas a lo que inserte en el vector.

0

Está prohibido utilizar referencias en cualquier contenedor. Puede justificar esto por el hecho de que un vector, por ejemplo, asigna los datos en la derecha y las referencias solo se pueden asignar una vez (durante la inicialización).

11

Es posible que desee comprobar

std::reference_wrapper 

disponible con C++ 11

+1

O creo 'boost :: reference_wrapper' para pre C++ 11 – Nick

+0

Esta es una respuesta útil, pero sería muy beneficioso de alguna explicación/ejemplo sobre qué' std :: reference_wrapper 'hace y cómo se usa. – luator

-1

finalmente utilizo

std::vector< const Type* > 

Un poco no bien parecido, pero hacer el mismo trabajo.

Cuestiones relacionadas