Per iniziare, il tuo codice è rotto. Restituire un riferimento o l'indirizzo di una variabile locale restituisce garbage. Non farlo mai. Qui ho riscritto il tuo esempio per restituire qualcosa di reale.
int xByAddress = 20;
int xByReference = 30;
int* returnByAddress()
{
return &xByAddress;
}
int& returnByReference()
{
return xByReference;
}
int main()
{
returnByReference() = 23; //possible
int x = 23;
returnByAddress() = &x; //not a lvalue error
*returnByAddress() = 245; //possible
return 0;
}
In questo esempio, xByReference
è assegnato al valore 23. xByAddress
è assegnato il valore 245. Ovviamente returnByAddress() = &x;
non è valido.
La regola è: funzioni restituiscono valori. L'unico modo per risolvere questo è restituire un riferimento.
returnByAddress()
restituisce un puntatore per valore. Puoi deferire il puntatore per ottenere un lvalue della cosa puntata.
Seguendo questa regola, puoi restituire un riferimento al puntatore.
int xByAddress = 20;
int *xPointer = nullptr;
int*& returnByPointerReference()
{
xPointer = &xByAddress;
return xPointer;
}
int main()
{
int x = 23;
returnByPointerReference() = &x; //not a lvalue error
return 0;
}
Questo codice cambia xPointer
per puntare all'indirizzo di x
.