Hay un malentendido común en torno a los términos lvalue/rvalue. No se refieren a variables, sino a expresiones. Una expresión puede producir un valor l o un valor r, y puede ser const o no const.
En particular, en su código, la expresión i
en el lado derecho de la definición int j = i;
es una expresión lvalue, no un valor r. A los efectos de la asignación, existe una conversión de valor a validar y luego se asigna a la variable recién declarada.
La continuidad es un concepto ortogonal, en la mayoría de los casos, y se refiere a si puede o no puede mutar el objeto con el que está tratando.
int f();
int& g();
const int& h();
const int k();
int main() {
f(); // non-const rvalue expression
g(); // non-const lvalue expression
h(); // const lvalue expression
k(); // const rvalue expression
f() = 5; // error, cannot assign to an rvalue
g() = 5; // correct, can modify a non-const lvalue
h() = 5; // error, cannot modify a constant lvalue
}
Otros ejemplos requieren el uso de tipos definidos por el usuario:
struct test {
void foo() { x = 5; }
void bar() const;
int x;
};
test f();
const test g();
int main() {
f().foo(); // f() is a non-const rvalue,
// but you can call a method on the resulting object
g().foo(); // g() is a const rvalue,
// you cannot call a mutating member function
g().bar(); // but you can call a const member function
}
“Requiere un' const'”: Si se acepta una' const A & ', también puede pasar que algunos' A & ', ya que el elenco de no-const a const ocurre implícitamente. –
Debe agregar el código de "su constructor de copia" y explicar lo que quiere decir con "requiere una' const' ". Esto ayudará a obtener una respuesta a su duda real, en lugar de una respuesta a una pregunta posiblemente engañosa. –