Für dieses ProgrammC++ Kopierkonstruktor, Provisorien und kopieren Semantik
#include <iostream>
using std::cout;
struct C
{
C() { cout << "Default C called!\n"; }
C(const C &rhs) { cout << "CC called!\n"; }
};
const C f()
{
cout << "Entered f()!\n";
return C();
}
int main()
{
C a = f();
C b = a;
return 0;
}
der Ausgang I erhalten ist:
Entered f()!
Default C called!
CC called!
Da f()
wird durch Wert zurückgibt, sollte es eine vorübergehende Rückkehr. Wie T a = x;
ist T a(x);
, würde es nicht den Kopierkonstruktor für den Bau von a
aufrufen, mit der vorübergehenden als Argument übergeben?
Ich benutze GCC, und mit '-fno-elide-constructors' zeigte es genau, was unter der Haube passiert! Manchmal verwirren diese Optimierungen den Lernenden sehr. Allerdings stimme ich zu, dass sie standardmäßig aktiviert sein sollten, da der Build einer uninformierten Person wieder standardmäßig optimiert wird. – legends2k
@ Legends2k: RVO ist zu nützlich, um den Launen der Benutzer überlassen zu werden.Außerdem ist dies einer der wenigen Fälle, in denen der Standard eine Optimierung ermöglicht. Das stärkt wieder, warum es so weiter geht. Beachten Sie jedoch, dass dies für andere Optimierungen im Allgemeinen nicht gilt. – dirkgently
Einverstanden, Punkt genommen. – legends2k