2011-08-06 5 views
11

¿Podría alguien explicar cómo se simula este error? y también de qué se queja esto.La referencia no constante solo puede estar vinculada a un lvalue

"Una referencia no constante sólo se puede unir a un valor-I" en C++

+2

¿Qué términos no comprende, 'referencia no const', 'enlazado' o 'lvalue'? – john

+1

@Seth: la pregunta es * preguntando * por algún código que proporcione este error. El interlocutor no puede satisfacer tu demanda. –

+0

@Steve Sí, mis ojos se saltaron la palabra _simulate_. –

Respuesta

41

Un lvalue es, aproximadamente, lo que pueda estar en el lado izquierdo de una declaración de asignación. Referencias proporcionan alias para otros objetos:

std::string s; 
std::string & rs = s; // a non-const reference to s 
std::string const & crs = s; // a const reference to s 

Teniendo en cuenta las definiciones anteriores, en referencia a rs o crs es el mismo que en referencia a s, excepto que no se puede modificar la cadena se hace referencia a través crs, ya que es const. Una variable es un valor l, por lo que puede enlazar una referencia no const a ella. En contraste puede enlazar referencias const a valores temporales como en:

std::string const & crs1 = std::string(); 

Sin embargo, el siguiente es ilegal:

std::string & rs1 = std::string(); 

Esto es porque el uso de referencias no constante que implica que usted desea modificar la referencia objeto. Sin embargo, los temporales vinculados a referencias se destruyen cuando la referencia sale del ámbito. Como no siempre es intuitivo cuando C++ crea objetos temporales, no se permite vincularlos a referencias que no sean const, para evitar la desagradable sorpresa de cambiar su objeto a su gusto, solo para ver que destruyó algunas declaraciones más adelante.

+0

+1 excelente ejemplo –

+0

@Nicola, una pregunta aquí. int metodo1 (int & a); Ahora, hace lo mismo solicitar thsi uno también – Pavan

+0

Absolutamente Una consecuencia directa es que no se puede llamar a esta función pasa un literal entero como argumento –

5

Esto significa que no se puede hacer algo como esto:

void foo(int &x) { ... } 
int bar()  { ... } 

foo(bar()); 

Usted necesitaría make foo tome una referencia const, o asigne el resultado de bar() a una variable, y luego pase eso a foo.

Cuestiones relacionadas