2010-06-26 10 views
6

Ist der folgende Code zulässig?Erlauben rvalue-Referenzen implizite Konvertierungen?

std::string&& x = "hello world"; 

g ++ 4.5.0 kompiliert diesen Code ohne Probleme.

+0

Kennen Sie einen interessanten Anwendungsfall? Ich dachte, der einzige Grund für benannte Rvalues ​​sei die Bindung an spezielle Überladungen. – Inverse

+0

@Inverse: Nun, genau darum habe ich wirklich gefragt und Argumente an Funktionen übergeben. Es ist nur so, dass ich, um die Frage zu stellen, nicht schreiben und eine Funktion aufrufen wollte;) Technisch gesehen gibt es keinen benannten R-Wert (außer den Schlüsselwörtern 'this' und' nullptr'). Wahrscheinlich meinen Sie einen benannten R-Wert * Verweis * - wie 'X' in diesem Beispiel, der ein L-Wert ist, kein R-Wert. – fredoverflow

Antwort

5

Dies wird derzeit im Usenet diskutiert. Siehe Rvalue reference example in 8.5/3 correct or wrong?.

Es ist nicht legal.

+0

@Jerry das ist ein Subbullet von "die Referenz soll eine Rvalue-Referenz und der Initializer-Ausdruck soll ein Rvalue sein", die das String-Literal nicht erfüllt. –

+0

@Jerry String-Literale sind L-Werte, wie in C. Siehe 5.1.1/1. Im Gegensatz zu einfachen Ints verweisen sie auf Objekte und müssen in Zeiger umgewandelt werden. Daher haben sie tatsächlich die Eigenschaft, ein "Speicher-Locator-Wert" zu sein (der Werte hat, die sich auf Objekte beziehen). –

+0

@Johannes: Yup - Ich hatte 5.1.1/1 nicht gefunden, was eindeutig so ist. Vielen Dank. Das macht die Interpretation eindeutig unmöglich. –

Verwandte Themen