Die Folie ist seltsam und irreführend. SWIG transformiert Pass-by-Value überhaupt nicht in Pass-by-Reference. Lassen Sie mich versuchen, an einem Beispiel zu verdeutlichen:
Sagen wir, wie im Beispiel Sie die C haben ++ Funktion
double dot_product(Vector a, Vector b);
Jetzt einfach in C++ (kein SWIG, keine Verpackung) Sie diese Funktion nutzen zu können, wie in die folgenden Beispiele:
1.
Vector a = Vector(1,0);
Vector b = Vector(0,1);
double zero = dot_product(a, b);
2.
Vector *a = new Vector(1,0);
Vector *b = new Vector(0,1);
double zero = dot_product(*a, *b);
In beiden Fällen wird die Funktion genau so aufgerufen, wie Call-by-Value.
SWIG umschließt alle Objekte in einer Struktur, die einen Zeiger auf das Objekt enthält. Unter der Haube übergibt SWIG also Zeiger für alles und verwendet daher eine Syntax wie im zweiten Beispiel. Aber es gibt keine Umwandlung/Transformation der Rufsemantik, egal welche.
Um Ihre Fragen zu beantworten:
„Scheint mit C++ zu funktionieren, wenn Sie nicht zu clever sind:“ Was es bedeutet zu klug zu sein?
Ich habe keine Ahnung. Wie in einer anderen Antwort gesagt, wahrscheinlich ein Witz.
Gibt es bekannte Situation/Fall, dass ich sehr vorsichtig sein sollte, wo ich C++ - Module programmieren und Python mit dem Swig-Tool erweitern?
Dies ist eine sehr breite Frage, und es gibt sicherlich Fallstricke, insbesondere im Zusammenhang mit Speicherverwaltung. Diese besondere "Transformation" ist jedoch kein Problem.
Als Referenz ist hier die relevant entry in the SWIG manual. Beachten Sie, dass es anders formuliert ist: Die Funktion wird umgewandelt, um Zeiger zu akzeptieren. Über "Call Semantics" wird nichts gesagt (da dies kein Problem ist).
Bei einer Schätzung würde ich annehmen, dass sie sagen, dass es funktioniert, wenn Ihr Kopierkonstruktor Semantik erwartet hat, aber ich kann nicht sicher sagen. – Flexo
Wenn Sie '--wrap' mit' ld' verwenden, könnte das stören, obwohl das auch für C gilt – OMGtechy