Newsgroup: it.comp.lang.c++
Titolo: return per valore, copy ctor e temporary!COSA SUCCEDE???

Vi Siete offesi...?
Ancora un po' di pazienza e buon cuore... l'esame e' maledettamente
vicino e ho bisogno di chiarezza.
mi spiego una classe d'esempio
#include <iostream.h>
class Stupida{
public:
Stupida(){cout <<"costruttore"<<endl;}
Stupida(const Stupida& objIdiota){cout<<"copy ctor"<<endl;}
~Stupida(){cout<<"distruttore"<<endl;}
};
Stupida f(){
cout<<"entroin f()"<<endl;
Stupida objEmilio;  //involontario, spero che nessuno si offenda
return objEmilio;
}
void main(){
cout <<"main"<<endl;
Stupida cloneEmilio = f();
cout <<"post asegnazione"<<endl;
}
OUTPUT
main
entroin f()
costruttore
copy ctor
distruttore
post asegnazione
distruttore
QUINDI se ho ben compreso(spero...)
entro nella funzione, istanzio objEmilio e lo ritorno,
fatalita' devo usare il valore ritornarto  (temporary , giusto?)
per riempire cloneEmilio (che ancora non esiste), sicche' il
compilatore crea cloneEmilio
usando il copyctor e come arg la temporary della mia funzione.
distrugge l'oggeto istanziato in f e POI esce dalla funzione!
ma allora il temporary l'ha creato da dentro la funzione per poi
uscirne?
Insomma chiritemi le idee dicendomi cosa fa ma soprattutto perche'...

 uscirne?
Per quanto ne so io (non molto...:), il campo di validità di una
variabile (non static) va dalla sua istanziazione al successivo '}', per
cui quando si entra nella funzione tutte le varibili al suo interno
verranno "distrutte" dopo il '}' che chiude la funzione; nel caso che il
valore ritornato sia assegnato ad una variabile, prima di distruggerlo
verrà assegnato ad essa (infatti nel tuo esempio prima di richiamare il
distruttore di objEmilio viene fatta l'assegnazione, richiamando il copy
constructor di cloneEmilo.
Spero di non aver detto cavolate, e di averti chiarito le idee. Ciao,
Cecco
PS: tanto per curiosità, objEmilio si riferisce a qualche personaggio
perticolare? :)

you wrote:
[snip]
Per quanto ne so io (non molto...:), il campo di validità di una
variabile (non static) va dalla sua istanziazione al successivo '}',
per
cui quando si entra nella funzione tutte le varibili al suo interno
verranno "distrutte" dopo il '}' che chiude la funzione; 
[snip]
Proprio da questo Dogma mi ero lasciato Fuorviare...
Grazie mille per la spiegazione.
p.s.
OGNI RIFERIMENTO A PERSONE o COSE E' COMPLETAMENTE ASSOLUTAMENTE E
PURAMENTE CASUALE!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"Vi assicuro: non e' divertente
sentirsi un referene di se stessi, cioe'
un reference di se stessi , cioe' ...."
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 Insomma chiritemi le idee dicendomi cosa fa ma soprattutto perche'...
In teoria:
1) si crea objEmilio all'interno di f
2) si utilizza l'oggetto objEmilio per creare un oggetto temporaneo da ritornare
3) si distugge objEmilio all'uscita da f
4) si utilizza il temporaneo per creare cloneEmilio
5) si distrugge il temporaneo dopo aver creato cloneEmilio
6) si distrugge cloneEmilio all'uscita da main
In pratica, nel tuo caso, il compilatore ottimizza il processo eliminando i punti 2 e 3 ed utilizzando objEmilio come temporaneo.
E' consigliata anche ai compilatori l'ottimizzazione del valore di ritorno temporaneo evitando il copy ctor ad. es in:
classe funzione ();
main {
classe obj = funzione(); }
può, invece che creare un oggetto temporaneo ed utilizzarlo per creare obj, creare direttamente obj.
Quindi, se ci riesce, prova ad impostare tutte le ottimizzazioni, e' autorizzato anche a saltare i punti 4 e 5, e quindi a compiere una sola costruzione ed una sola distruzione.
Ciao Fulvio.

2) si utilizza l'oggetto objEmilio per creare un oggetto temporaneo da ritornare
ecco, la questione di questi valori di ritorno 
temporanei non mi è affatto chiara
Chi mi può mandare qualche link di documentazione/manualii on-line
in cui la cosa è spiegata da 0? (oppure se qualcuno mi spiega passo a
passo cosa succede....)
Ciao
-- 
Davide Cavallari
* per contattarmi via e-mail, eliminare "NOSPAM" dall'indirizzo *