Heim > Backend-Entwicklung > C++ > Warum schlägt die Übergabe eines temporären Objekts an eine nicht konstante Referenz in C fehl?

Warum schlägt die Übergabe eines temporären Objekts an eine nicht konstante Referenz in C fehl?

Patricia Arquette
Freigeben: 2024-12-05 09:07:11
Original
351 Leute haben es durchsucht

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

Ü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;
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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 :

  • Erstellen Sie eine temporäre Variable:Erstellen Sie eine nicht temporäre Variable, die die enthält temporäres Objekt, bevor Sie es an die Funktion übergeben:
Foo foo42(42);
ProcessFoo(foo42);
Nach dem Login kopieren
  • Verwenden Sie eine Const-Referenz: Ändern Sie die Funktion, um einen Const-Referenzparameter zu verwenden:
void ProcessFoo(const Foo& foo)
Nach dem Login kopieren
  • Wert übergeben: Ermöglicht der Funktion, das Objekt als Wert zu übernehmen Parameter:
void ProcessFoo(Foo foo)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage