Implizite Konvertierung von lWert zu rWert

Ich sehe den Begriff "Wert-zu-Wert-Konvertierung", der an vielen Stellen im gesamten C ++ - Standard verwendet wird. Diese Art der Konvertierung wird, soweit ich das beurteilen kann, oft implizit durchgeführt.

Ein (für mich) unerwartetes Merkmal der Formulierung aus dem Standard ist, dass sie sich dafür entscheiden, lvalue-to-rvalue als Konvertierung zu behandeln. Was wäre, wenn sie gesagt hätten, dass ein glvalue immer akzeptabel ist anstatt eines prvalue. Würde dieser Satz tatsächlich eine andere Bedeutung haben? Zum Beispiel lesen wir, dass l- und x-Werte Beispiele für gl-Werte sind. Wir lesen nicht, dass l- und x-Werte in gl-Werte konvertierbar sind. Gibt es einen Unterschied in der Bedeutung?

Vor meiner ersten Begegnung mit dieser Terminologie modellierte ich geistig Werte und R-Werte mehr oder weniger wie folgt: "Werte sindimmer in der Lage, als rWerte zu fungieren, kann aber zusätzlich auf der linken Seite eines=und rechts von einem&".

Dies ist für mich das intuitive Verhalten, dass ich, wenn ich einen Variablennamen habe, diesen Namen überall dort setzen kann, wo ich ein Literal gesetzt hätte. Dieses Modell scheint mit der im Standard verwendeten Terminologie für implizite Konvertierungen von Wert zu Wert übereinzustimmen, sofern diese implizite Konvertierung garantiert erfolgt.

Aber weil sie diese Terminologie verwenden, habe ich mich gefragt, ob die implizite Umwandlung von lWert in rWert in einigen Fällen fehlschlagen kann. Das heißt, vielleicht ist mein mentales Modell hier falsch. Hier ist ein relevanter Teil der Norm: (Dank an die Kommentatoren).

Immer wenn ein glvalue in einem Kontext erscheint, in dem ein prvalue erwartet wird, wird der glvalue in einen prvalue konvertiert. siehe 4.1, 4.2 und 4.3. [Anmerkung: Der Versuch, eine r-Wert-Referenz an einen l-Wert zu binden, ist kein solcher Kontext. siehe 8.5.3. - Endnote]

Ich verstehe, was sie in der Notiz beschreiben, ist Folgendes:

int x = 1;
int && y = x; //in this declaration context, x won't bind to y.
// but the literal 1 would have bound, so this is one context where the implicit 
// lvalue to rvalue conversion did not happen.  
// The expression on right is an lvalue. if it had been a prvalue, it would have bound.
// Therefore, the lvalue to prvalue conversion did not happen (which is good). 

Also, meine Frage ist (sind):

1) Könnte jemand die Zusammenhänge klären, in denen diese Konvertierung implizit stattfinden kann? Gibt es, abgesehen vom Kontext der Bindung an eine rWert-Referenz, eine andere, in der lWert-zu-rWert-Konvertierungen implizit fehlschlagen?

2) Auch die Klammer[Note:...] in der Klausel sieht es so aus, als hätten wir es aus dem Satz herausfinden können. Welcher Teil des Standards wäre das?

3) Bedeutet das, dass die rWert-Referenz-Bindung kein Kontext ist, in dem wir einen Wertausdruck (rechts) erwarten?

4) Umfasst die Konvertierung von glvalue in prvalue wie bei anderen Konvertierungen Arbeiten zur Laufzeit, die es mir ermöglichen würden, diese zu beobachten?

Mein Ziel ist es hier nicht zu fragen, ob es wünschenswert ist, eine solche Konvertierung zuzulassen. Ich versuche zu lernen, mir das Verhalten dieses Codes anhand des Standards als Ausgangspunkt zu erklären.

Eine gute Antwort würde das Zitat durchgehen, das ich oben platziert habe, und erklären (basierend auf dem Parsen des Texts), ob die Notiz darin auch aus dem Text impliziert ist. Es werden dann möglicherweise andere Anführungszeichen hinzugefügt, die mich über die anderen Kontexte informieren, in denen diese Konvertierung möglicherweise implizit fehlschlägt, oder erklären, dass es keine solchen Kontexte mehr gibt. Vielleicht eine allgemeine Diskussion darüber, warum glvalue zu prvalue als Konvertierung angesehen wird.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage