Ja - es erstellt ein temporäres Zeichenfolgenobjekt, das das grundlegende (C-style) Zeichenfolgenliteral in Ihrer return-Anweisung verwendet und das als temporären Wert zurückgibt. Jeder, der Ihre Funktion aufruft, muss entweder den temporären rvalue in einen lvalue kopieren oder er wird am Ende der Anweisung verworfen.
Oder, um genauer zu sein, der Compiler ist hilfreich, indem er automatisch den Konvertierungskonstruktor von std :: string aufruft, um den String (a const char*
) in eine Zeichenkette umzuwandeln, was Ihren Code mehr oder weniger äquivalent zu return std::string("kittens")
macht.
Here is a short (but useful) primer on the difference between lvalues and rvalues
Technisch, was Sie auf dem Laufenden ist kein Ausdruck, L-Wert, oder R-Wert; Es ist eine Funktionsdefinition. Aber angesichts dieser Definition wäre der Ausdruck 'three()' ein rvalue. – aschepler