Estoy un poco confundido en este momento con respecto a la semántica de referencia de C++. Supongamos que tengo una clase que devuelve una referencia constante:Impedir la copia al inicializar un objeto no const desde una referencia de referencia
class foo
{
private:
std::map<int, int> stuff;
public:
const std::map<int, int>& getStuff()
{
return stuff;
}
};
y lo uso de la siguiente manera:
foo f;
const std::map<int, int>& s = f.getStuff();
lo cual está bien, pero si tuviera que utilizarlo como sigue:
foo f;
std::map<int, int> s = f.getStuff();
¿Qué sucede exactamente?
Si entiendo correctamente, se devolvió una referencia constante a stuff
y se creó una copia en s
en la que puedo causar estragos. ¿Hubiera alguna forma de evitar esto?
edición:
Así que no hay manera de evitar el constructor de copia que se llama aquí, por std :: mapa de todos modos ...
AFAIK se llamará al constructor de copias y no veo una manera de evitar esto. – Lagerbaer
Tienes razón. Pero siempre puedes hacer 's' const si quieres evitar eso. Además, hacer 's' a const ref significa que debes asegurarte de que' f' permanezca activa mientras tanto, lo que sucederá automáticamente si es una variable automática previamente declarada como lo es aquí, pero requiere administración si fue creado en el montón. –
Pero cualquier modificación que realice en 's' no afectará al objeto original' cosas '. Entonces, ¿cómo te afecta? – Naveen