Ich habe gelesen über die universellen Referenzen in Scotts letzten Meisterstück über die C++ 11 und 14 mit dem gesagt trotz eines Arguments entweder Lvalue oder einem Rvalue-Typ zugewiesen Referenzparameter Es gibt etwas dazwischen, das als universelle Referenz bezeichnet wird, die basierend auf dem Typmerkmal eines übergebenen Arguments entweder zu l/rvalue abgeleitet werden konnte. Ich konnte verstehen, was die Parameter als universelle Referenz macht aber die eine Sache, die mich nicht klar, warum tut, ist das Hinzufügen const den Typ Parameter const T&& p
die p als rvalue machen:Warum fügt "const" die universelle Referenz als rvalue hinzu
template<typename T>
void f(T&& param); // param is an universal reference
template<typename T>
void f(const T&& param); // param is an rvalue reference
Hat die const
mehr tun, als dies wenn es dem Referenzparameter zugewiesen ist.
Um an den Teil von Item 24 in _Effective Modern C++ _, das das OP verwirrte, zurückzubinden, beschreiben Scott (lose) universelle Referenzen als rvalue-Referenzen _in einem Typ, der Kontext kontextupliziert. Der erste (nicht hervorgehobene) Satz in der obigen 14.8.2.1-Standardzitat (_ "Wenn P ein cv-qualifizierter Typ ist, werden die cv-Qualifikationsmerkmale der oberen Ebene des P-Typs ** für die Typableitung **" _) eindeutig ignoriert erklärt Scotts Aussage, dass _ "selbst die einfache Anwesenheit eines" const "Qualifikators ausreicht, um eine Referenz vom universellen zu disqualifizieren" (Zitat aus Buch, Punkt 24). – dfri
@dfri Danke, ich hatte keine digitale Kopie von EMC++ in der Nähe. – TemplateRex
Mehr Motivation in Bezug auf das Warum: Manchmal müssen wir sagen: Binden Sie nicht an einen R-Wert, sondern nur an L-Werte: 'template void cref (const T &&) = löschen;'. –