c++ - tipos - Enlazar la referencia de valor a lvalue con `void*`
retornar en c++ (2)
Además de la respuesta de @songyuanyao: podría hacer un valor de iptr
por ejemplo, mediante static_cast
:
int* iptr = nullptr;
int*&& irr = static_cast<int *>(iptr);
Mientras trataba de entender cómo funcionan las referencias de valores, terminé con este código:
int* iptr = nullptr;
int*&& irr = iptr;
Compilar el código anterior da el siguiente error:
error: la referencia de rvalue al tipo ''int *'' no se puede enlazar a un valor de tipo ''int *''
Entiendo que esto es correcto, pero ¿por qué el siguiente código, donde se vincula usando un void*
lugar de int*
, se compila sin ningún problema? ¿Será correcto el comportamiento en tiempo de ejecución o debo esperar un comportamiento indefinido?
int* iptr = nullptr;
void*&& irr = iptr;
Esto está bien formado.
int*
y void*
son tipos diferentes; no puede enlazar un int*
para hacer referencia a void*
directamente. El int*
debe convertirse en void*
primer lugar, que es un objeto temporal y podría estar vinculado a rvalue-reference. (PS la vida útil del temporal se extiende a la vida útil de la referencia).
Tenga en cuenta que irr
no se une a iptr
; por lo que cualquier modificación no tiene nada que ver con iptr
.
Esto no es especial para void*
, lo mismo sucede con otros tipos, por ejemplo,
char c;
int&& r = c; // a temporary int is constructed from c and then bound to r;
// its lifetime is extened to the lifetime of r