Cześć,
Proszę Was o wyjaśnienie zachowania kompilatora przy funkcji zwracającej wartość.
Mam prostą klasę MojaKlasa posiadającą tylko "gadające" konstruktory (domyślny, kopiujący i przenoszący) oraz destruktor. Program testujący:
#include <iostream>
using namespace std;
MojaKlasa
{
// tu gadajace konstruktory i destruktor.
};
MojaKlasa MojaFunkcja (MojaKlasa arg)
{
cout<<"w funkcji\n";
return arg;
}
int main()
{
MojaKlasa x;
cout<<"przed funkcja\n";
MojaFunkcja (x);
cout<<"po funkcji\n";
return 0;
}
Program drukuje (zwykłym drukiem moja interpretacja):
"konstruktor domyślny" - powstaje zmienna x.
"przed funkcją"
"konstruktor kopiujacy" - w funkcji powstaje zmienna lokalna arg będąca kopią zmiennej x. Zmienna x to l-wartość więc kompilator uruchamia konstruktor kopiujący.
"w funkcji"
"konstruktor przenoszacy" - instrukcja return tworzy tu zmienną tymczasową będącą kopią zmiennej arg. Zmienna arg to l-wartość - więc dlaczego kompilator uruchamia tu konstruktor przenoszący a nie kopiujący?
"destruktor" - likwidacja zmiennej tymczasowej.
"destruktor" - likwidacja zmiennej arg.
"po funkcji"
"destruktor" - likwidacja zmiennej x.
Czy konstruktor przenoszący zostaje tu uruchomiony dlatego bo kompilator dokonuje jakiejś optymalizacji? - np. "widzi" że zmienna arg zaraz zginie więc lepiej ją "przesunąć" niż skopiować - więc zamienia ją na r-wartość (np. funkcją std::move) i uruchamia konstruktor przenoszący.
Czy dobrze to rozumiem?
Pozdrawiam,
M.