Kann ich diesen C++-Aufruf mit einem Zeiger in einen Aufruf mit einer Referenz umwandeln?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Kann ich diesen C++-Aufruf mit einem Zeiger in einen Aufruf mit einer Referenz umwandeln?

by Guest » 18 Jan 2025, 21:45

Ich habe eine Situation, in der es praktisch wäre, eine vorhandene Funktion aufzurufen, die ein Referenzargument akzeptiert, und zwar mit einem Aufruf über eine std::function, die einen Zeiger anstelle einer Referenz als Argument verwendet.
Im folgenden Code ist die generierte Assembly für die Funktionen testRef und testPtr auf mehreren Compilern, für verschiedene Prozessoren und mit einigen Standardeinstellungen (nicht optimierte Compilereinstellungen) identisch, und die generierte Assembly für die ersten beiden Aufrufe in testConversion ist ebenfalls identisch. Dies ist angesichts der engen Beziehung zwischen einem Zeiger und einer Referenz nicht überraschend.
Außerdem können Sie in der unten gedruckten Ausgabe sehen, dass ich das mit altmodischen C-Funktionszeigern kann Rufen Sie die Referenzfunktion mit einem Zeigerargument auf und das Ergebnis ist „richtig“; es ist die 3. Zeile der Ausgabe. Das ist nicht überraschend.
Aber in der letzten Zeile der Ausgabe können Sie sehen, dass ein Aufruf von einem C++-Objekt in ein std::function-Objekt umgewandelt wird, mit einem Zeigerargument, dem Aufruf geht zwar zu testRef (der Referenzfunktion), aber die Ergebnisse sind nicht „richtig“; Verschiedene andere Umwandlungen verursachen Seg-Fehler oder anderes schlechtes Verhalten.
Warum funktioniert das nicht und gibt es eine Möglichkeit, diese Umwandlung zum Laufen zu bringen, indem man beispielsweise an der Funktion std:: herumfummelt? ?
Ich verstehe, dass es andere Ansätze für das allgemeine Problem gibt; Ich kann das größere Ziel leicht mit anderen Mitteln (Schnittstellenobjekte, Konvertierungsoperatoren usw. usw.) erreichen, und am Ende verwende ich möglicherweise eines dieser anderen Mittel, aber dieser Ansatz bleibt für mich interessant und ich bin interessiert in Frage, ob es zum Laufen gebracht werden kann, und wenn nicht, warum nicht.
Ich verstehe auch, dass ich die Unterscheidung zwischen Referenzen und Zeigern „breche“. Kommentieren Sie nach Belieben, wenn Sie der Meinung sind, dass dies für andere Leser interessant ist, ich aber nicht danach frage oder daran interessiert bin.
Vielen Dank.

Code: Select all

#include 
#include 
#include 

class MyClass
{
public:
MyClass () {
mA = 1;
mB = 2;
mC = 3;
}
int mA;
int mB;
int mC;
};

void testRef (MyClass &asRef)
{
std::cout

Top