====== Forward bei Funktionsparametern ====== Ein Forward bei Funktionsparametern dient dazu, Daten per Copy by Value gar nicht erst auf den Stack zu kopieren, um es dann weiter zu kopieren, sondern es direkt an die passende Position setzen zu lassen. Bei Funktionen, die zu einer API gehören, wird Forward ignoriert, bzw. angewarnt, wenn die Klasse als API markiert ist. Beispiel: func( Elem const & elem ) { ... Style style; ... style.elem = elem; } wird zu func( forward style.elem, primitiv is int ) := { primitiv is int; style is Style; // liegt mit Aufruf der Funktion auf dem Stack // semantisch implizierter Aufruf style.elem = arg1; wobei decltype( arg1 )) == decltype ( Style::elem )) } Zu beachten ist, dass Style keinen Konstruktoraufruf benötigen darf, sondern ein Primitiv sein muss (int, struct, ...), bzw. eine Klasse, die invalid existieren darf. Point contains { x,y,z is double; construct() = uninitialized; // Ein Objekt darf ohne Argumente erzeugt werden, erzeugt aber ein nicht initialisiertes Objekt. construct( .x, .y, .z ); }; to3d( forward p.x, p.y ) := { p is Point; p.z = 0; return p; } Im Idealfall sorgt das dafür, dass der Aufruf x is to3d( 1, 2 ) lokal den Speicherplatz für einen Point erzeugt und die der Aufruf der Funktion to3d gleich den lokalen Speicherplatz mit (1, 2) belegt, ohne dass dafür die Funktion bereits angesprungen wird. Dann wird die Funktion aufgerufen und schreibt nur noch ''p.z = 0'' und springt zurück. Und hier könnte der Compiler sich dann überlegen, ob p.z=0 nicht besser geinlined wird.