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
Patricia ArquetteOriginal
2024-12-05 09:07:11388Durchsuche

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;
}

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 :

  • 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);
  • Verwenden Sie eine Const-Referenz: Ändern Sie die Funktion, um einen Const-Referenzparameter zu verwenden:
void ProcessFoo(const Foo& foo)
  • Wert übergeben: Ermöglicht der Funktion, das Objekt als Wert zu übernehmen Parameter:
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!

Stellungnahme:
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