Tengo un pequeño problema para averiguar exactamente cómo se aplica la const en un caso específico. Aquí está el código que tengo:Const Struct &
struct Widget
{
Widget():x(0), y(0), z(0){}
int x, y, z;
};
struct WidgetHolder //Just a simple struct to hold four Widgets.
{
WidgetHolder(Widget a, Widget b, Widget c, Widget d): A(a), B(b), C(c), D(d){}
Widget& A;
Widget& B;
Widget& C;
Widget& D;
};
class Test //This class uses four widgets internally, and must provide access to them externally.
{
public:
const WidgetHolder AccessWidgets() const
{
//This should return our four widgets, but I don't want anyone messing with them.
return WidgetHolder(A, B, C, D);
}
WidgetHolder AccessWidgets()
{
//This should return our four widgets, I don't care if they get changed.
return WidgetHolder(A, B, C, D);
}
private:
Widget A, B, C, D;
};
int main()
{
const Test unchangeable;
unchangeable.AccessWidgets().A.x = 1; //Why does this compile, shouldn't the Widget& be const?
}
Básicamente, tengo una clase llamada prueba. Utiliza cuatro widgets internamente, y necesito que los devuelva, pero si la prueba se declaró const, quiero que los widgets vuelvan también a const.
¿Puede alguien explicarme por qué el código en main() se compila?
Muchas gracias.
nuevos widgets no se están creando en WidgetHolder; los miembros son referencias pero los argumentos del constructor son copias. –
Patrick estás equivocado. El constructor está creando nuevos widgets y luego las referencias son referencias a esos nuevos widgets. Él no está recibiendo referencias a sus widgets originales. –