Temporäres Objekt kann nicht als Referenz übergeben werden

Dies ist ein sehr minimales Beispiel:

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

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}

Der obige Befehl kann in Visual Studio problemlos kompiliert werden, generiert jedoch unter Linux und Mac einen Fehler.

as Kompilieren des Obigen erzeugt die

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

Vermeiden Sie die Verwendung einer Inline-temporären Variablen für den Aufruf von ProcessFoo.

So was

Foo foo42(42);
ProcessFoo(foo42);

ProcessFoo verwendet eine konstante Referenz:void ProcessFoo(const Foo& foo)

ei @ProcessFoo wird Foo nur nach Wert übergeben.void ProcessFoo(Foo foo)

Warum verbietet der Compiler meinen Originalcode? (Wovor schützt es)? Was befriedigt den Compiler an jeder der drei obigen Problemumgehungen? Was würde MSVC erlauben, aber nicht g ++?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage