Temporäre Objekte als Referenzen übergeben
In C kann die Verwendung eines temporären Objekts als Referenz zu unerwartetem Verhalten führen. Um dies zu vermeiden, erzwingt der Compiler Einschränkungen bei der Übergabe temporärer Objekte an Referenzparameter.
Beim Kompilieren des in der ersten Abfrage bereitgestellten Codes:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) {}; int main() { ProcessFoo(Foo(42)); return 0; }
Der Fehler tritt auf, weil das temporäre Foo(42 )-Objekt wird an einen nicht konstanten Referenzparameter (ProcessFoo(Foo& foo)) übergeben. C erlaubt diese Vorgehensweise per Design nicht.
Problemumgehungen:
Die vorgeschlagenen Problemumgehungen lindern das Problem durch:
Erstellen einer temporären Variablen: Zuweisen des temporären Objekts zu einer Variablen und anschließendes Übergeben als Referenz:
Foo foo42(42); ProcessFoo(foo42);
Verwenden einer Const-Referenz: Ändern von ProcessFoo, um eine Const-Referenz (ProcessFoo(const Foo& foo)) zu verwenden, die es ermöglicht, temporäre Referenzen zu akzeptieren Objekte:
void ProcessFoo(const Foo& foo) {}; ProcessFoo(Foo(42));
Vorbeigehen Wert: Erlaubt ProcessFoo, das Objekt nach Wert zu empfangen (ProcessFoo(Foo foo)), wodurch die Referenzbeschränkung vermieden wird:
void ProcessFoo(Foo foo) {}; ProcessFoo(Foo(42));
Compiler-Diskrepanz:
Der Verhaltensunterschied zwischen Microsoft Visual Studio und GNU C (g) ist wahrscheinlich auf unterschiedliche Standardeinstellungen zurückzuführen. Standardmäßig erzwingt g eine strengere Einhaltung des C-Standards, während Visual Studio bestimmte Abweichungen zulassen kann. Dies kann dazu führen, dass in einem Compiler Fehler generiert werden, im anderen jedoch nicht.
Das obige ist der detaillierte Inhalt vonWarum kann ich ein temporäres C-Objekt nicht an eine nicht konstante Referenz übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!