Dieser Code:
#include <iostream>
using namespace std;
struct s{};
void someFunction(s& value){ std::cout << "ref" << std::endl; }
void someFunction(const s&& value){ std::cout << "const" << std::endl; }
void someFunction(s&& value){ std::cout << "non const" << std::endl; }
const s foo() { return s(); }
s bar() { return s(); }
int main() {
someFunction(bar());
someFunction(foo());
return 0;
}
Prints
non const
const
Für eine Erklärung (die ich nicht zur Verfügung stellen kann;) Ich verweise Sie auf this site. Das wichtigste Zitat ist:
[...] Dies macht Const rvalue Referenzen ziemlich nutzlos. Denken Sie darüber nach: Wenn alles, was wir brauchen, eine nicht veränderbare Referenz auf ein Objekt ist (rvalue oder lvalue), dann macht eine const lvalue-Referenz die Aufgabe perfekt. Die einzige Situation, in der wir Rvalues aussortieren wollen, ist, wenn wir sie verschieben wollen. Und in diesem Fall brauchen wir eine modifizierbare Referenz.
Der einzige Anwendungsfall ich mich vorstellen könnte ist someFunction
zu verwenden, um festzustellen, ob eine zweite Funktion ein const
oder ein nicht const
zurückkommt, aber ich denke, es gibt einfachere Wege, das herauszufinden.
Als Nebenbemerkung: Wenn Sie s
mit int
in obigem Code ersetzen it prints:
non const
non const
und das ist, weil (aus dem gleichen Ort zu zitieren, Kommentar von Pizer):
Es gibt keine konstanten Werte von Skalartypen. Für einen konstanten Wert benötigen Sie entweder ein Xvalue- und/oder ein Klassen-Objekt. [...]
http://www.codesynthesis.com/~boris/blog/2012/07/24/const-rvalue-references/. "Genauer gesagt, wird ein const rvalue es vorziehen, an die const rvalue-Referenz und nicht an die const lvalue-Referenz zu binden." Aber, Sie sollten sich nicht mit Const rvalues beschäftigen. Sie ergeben nicht viel Sinn. – mutex36