Hallo.
Ich hatte immer gedacht, dass C++ für Rvalues die an eine Funktion übergeben werden, die ihre Argumente by value annimmt, ebenfalls eine Kopie anlegt.
Doch scheinbar ist dies nicht der Fall.
Etwas Code um das ganze zu verdeutlichen:
Alles anzeigen
Ich hatte mit folgender Ausgabe gerechnet:
doch ich bekomme diese:
Also moved der Compiler den Aufruf A() in den Funktionsstack von foo oder was geht da von statten? Und wie heißt dieses Verfahren?
Ich hatte immer gedacht, dass C++ für Rvalues die an eine Funktion übergeben werden, die ihre Argumente by value annimmt, ebenfalls eine Kopie anlegt.
Doch scheinbar ist dies nicht der Fall.
Etwas Code um das ganze zu verdeutlichen:
Quellcode
- #include <iostream>
- struct A {public: int id; bool copy;
- explicit A() : id(42) { std::cout << "CTor: " << id << std::endl;
- copy = false; }
- A(int val) : id(val) { std::cout << "CTor: " << id << std::endl;
- copy = false; }
- A(const A& a) { std::cout << "Copy CTor" << std::endl;
- copy = true; id = a.id * 2; }
- A(const A&& a) { std::cout << "Move" << std::endl;
- id = a.id; copy = false; }
- ~A() { if (copy) std::cout << "Copy "; std::cout << "DTor: " << id << std::endl; }};
- void foo(A a) { std::cout << "foo says " << a.id << std::endl;}
- int main() { A a; foo(a); std::cout << "====" << std::endl; foo(A(23)); std::cout << "end of main" << std::endl;}
Ich hatte mit folgender Ausgabe gerechnet:
CTor: 42
Copy CTor
foo says 84
Copy DTor: 84
====
CTor: 23
Copy CTor
foo says 46
Copy DTor: 46
end of main
DTor: 42
DTor: 23
doch ich bekomme diese:
CTor: 42
Copy CTor
foo says 84
Copy DTor: 84
====
CTor: 23
foo says 23
DTor: 23
end of main
DTor: 42
Also moved der Compiler den Aufruf A() in den Funktionsstack von foo oder was geht da von statten? Und wie heißt dieses Verfahren?