Temporäres Objekt kann nicht als Referenz übergeben werdenC++

Programme in C++. Entwicklerforum
Anonymous
 Temporäres Objekt kann nicht als Referenz übergeben werden

Post by Anonymous »

Dies ist ein sehr minimales Beispiel:

Code: Select all

class Foo
{
public:
Foo(int x) {};
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
ProcessFoo(Foo(42));
return 0;
}
Das Obige lässt sich gut in Visual Studio kompilieren, erzeugt jedoch einen Fehler unter Linux und Mac.
Das Kompilieren des Obigen erzeugt Folgendes:

Code: Select all

$ g++ -std=c++11 -c newfile.cpp

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)
Ich habe drei Problemumgehungen gefunden:
  • Erstellen Sie eine temporäre Variable für den Aufruf von ProcessFoo.
So:

Code: Select all

Foo foo42(42);
ProcessFoo(foo42);
  • ProcessFoo nimmt eine konstante Referenz: void ProcessFoo(const Foo& foo)
  • ProcessFoo lässt Foo einfach als Wert übergeben. void ProcessFoo(Foo foo)
Warum verbietet der Compiler meinen Originalcode? (Wovor schützt es)? Was ist an jeder der drei oben genannten Problemumgehungen so, dass der Compiler zufrieden ist? Was würde MSVC erlauben, aber nicht g++?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post