2016-03-20 11 views
3

Warum kompiliert die erste Zeile nicht, während die zweite Zeile kompiliert?C++ - Konstruktor des Klassentyps gibt einen Lvalue zurück?

float& t = float(10); // initial value of reference to non - const must be an lvalue 
string& w = string("gg"); 

Bedeutet dies, dass der Zeichenfolgenkonstruktor einen Lvalue zurückgibt?

+0

g ++ 4.8.2 gibt für * jede * dieser Zeilen einen "Fehler: ungültige Initialisierung der nichtkonstanten Referenz vom Typ ...". –

+0

Das ist eine gute Frage, die mich wundern lässt, wie es hier immer jemanden gibt, der die Fragen ablehnt/nahe abstimmt (und ohne auch nur einen Kommentar zu hinterlassen, warum). Einige Nutzer sollten dieses Privileg zu Recht berauben. –

+1

Ich denke, die zweite Zeile kompiliert, weil Sie MSVC verwenden und Sie nicht mit/W4 kompilieren. Hätten Sie mit/W4 kompiliert, hätten Sie etwas wie "Warnung C4239: nicht standardmäßige Erweiterung verwendet" gesehen. – cpplearner

Antwort

3

Konstruktor nach der Definition hat keinen Rückgabewert. Sie versuchen, einen temporären Wert anzugeben, der nicht zulässig ist.

Guter Artikel zu verstehen, sowohl lvalue und rvalue Referenzen ist C++ Rvalue References Explained.

+0

"Was Sie versuchen, ist ein Verweis auf einen temporären Wert, der nicht erlaubt ist." Ja, ich stimme dieser Aussage zu. Ich war nur verwirrt, warum die zweite Zeile kompiliert. cpplearner hat Recht. Ich benutze MSVC. Vielleicht hat MSVC einige spezielle Eigenschaften? – Eugene

+0

Das ist seltsam, weil ich in beiden Fällen mit gcc und clang den gleichen Fehler bekomme: 'kann nicht-konstante Referenz von einem rvalue initialisieren'. – karastojko

2

Was Sie bekommen, ist nicht das, was Sie erwarten:

float& ref = float(10); 

Was hier passiert? float(10) erstellt ein temporäres float (nicht an irgendetwas gebunden), es ist also ein rvalue. Daher können Sie es nicht an eine nicht konstante lvalue-Referenz binden.

float const & cref = float(10); // OK! 

Die in dieser beteiligt Mechanik sind für std::string. Ich bin erstaunt, dass Sie keinen Compilerfehler im String-Beispiel bekommen (ich mache mit gcc 5.3.0)

Beachten Sie, dass dies nichts mit einem sogenannten "Konstruktor Rückgabewert" zu tun hat, da Konstruktoren keine haben solche Sache.

+0

Danke für Ihre Antwort. Ich denke, das liegt daran, dass ich MSVC verwende. – Eugene

Verwandte Themen