Passa l’object temporaneo alla funzione che prende il puntatore

Ho provato il seguente codice:

#include #include using namespace std; string f1(string s) { return s="f1 called"; } void f2(string *s) { cout<<*s<<endl; } int main() { string str; f2(&f1(str)); } 

Ma questo codice non viene compilato.
Quello che penso è: f1 restituisce per valore quindi crea temporaneamente, di cui sto prendendo indirizzo e passando a f2.
Ora per favore spiegami dove sto pensando male?

L’unario & accetta un lvalue (o un nome di funzione). La funzione f1() non restituisce un lvalue, restituisce un valore rvalue (per una funzione che restituisce qualcosa, a meno che non restituisca un riferimento, il suo valore di ritorno è un valore), quindi l’unario & non può essere applicato ad esso.

È ansible creare (e passare) un puntatore a un object temporaneo, assumendo che tu sappia cosa stai facendo. Tuttavia, dovrebbe essere fatto in modo diverso.

Una funzione con valore di ritorno di tipo non di riferimento restituisce un valore . In C ++ è vietato applicare l’operatore unario incorporato & un valore rvalue. Richiede un lvalue.

Questo significa che se vuoi ottenere un puntatore al tuo object temporaneo, devi farlo in un altro modo. Ad esempio, come sequenza a due righe

 const string &r = f1(str); f2(&r); 

che può anche essere piegato in una singola riga usando un cast

 f2(&(const string &) f1(str)); 

In entrambi i casi, la funzione f2 deve accettare un parametro const string * . Solo una string * come nel tuo caso non funzionerà, a meno che non elimini la costanza dall’argomento (che, a dir la verità, renderà il tutto ancora più brutto di quanto non sia già). Sebbene, se la memoria mi serve, in entrambi i casi non è ansible garantire che il riferimento sia collegato all’originale temporaneo e non a una copia.

Basta tenere a mente anche se la creazione di puntatori a oggetti temporanei è una pratica piuttosto discutibile, perché se gli evidenti problemi di durata. Normalmente dovresti evitare di farlo.

Il tuo programma non si compila perché f1 ha un parametro e non ne passi nessuno.

Inoltre, il valore restituito da una funzione è un valore, non puoi prendere il suo indirizzo.

Prova questo:

 int main() { string str; string str2 = f1(str); // copy the temporary f2(&str2); }