Übergabe temporärer Objekte als Referenzen in C
In C kann ein minimaler Codeausschnitt wie der folgende zu Kompilierungsfehlern unter Linux und Mac führen Plattformen:
class Foo { public: Foo(int x) {} }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
Zusammenstellung Fehler:
Das Kompilieren des obigen Codes führt zu folgendem Fehler:
newfile.cpp: In function ‘int main()’: newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’ ProcessFoo(Foo(42)); ^ newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’ void ProcessFoo(Foo& foo)
Warum der Fehler auftritt:
Beabsichtigt, C verbietet die Übergabe eines temporären Objekts an einen nicht konstanten Referenzparameter. Diese Einschränkung soll mögliche Missverständnisse und Fehler verhindern. Wenn eine Funktion einen nicht konstanten Referenzparameter deklariert, zeigt sie ihre Absicht an, das Objekt zu ändern und an den Aufrufer zurückzugeben. Die Übergabe eines temporären Parameters an einen solchen Parameter ist unlogisch, da er zerstört wird, sobald die Funktion zurückkehrt.
Problemumgehungen:
Um diesen Kompilierungsfehler zu beheben, ziehen Sie die folgenden Problemumgehungen in Betracht :
Foo foo42(42); ProcessFoo(foo42);
void ProcessFoo(const Foo& foo)
void ProcessFoo(Foo foo)
Warum MSVC dies zulässt:
Es ist unklar, warum Microsoft Visual Studio (MSVC) die Kompilierung dieses Codes zulässt, während g dies nicht zulässt. Möglicherweise hat MSVC diesbezüglich eine andere Interpretation des C-Standards. Es wird allgemein empfohlen, den Standard zu befolgen, um ein konsistentes Verhalten über verschiedene Compiler hinweg sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Übergabe eines temporären Objekts an eine nicht konstante Referenz in C fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!