lwartość do wartościowania niejawnej konwersji

Widzę termin „konwersja wartości l-wartości do rval” używany w wielu miejscach w standardzie C ++. Tego rodzaju nawrócenie często odbywa się pośrednio, o ile wiem.

Jedną z nieoczekiwanych (dla mnie) cech frazowania standardu jest to, że decydują się traktować lvalue-to-rvalue jako konwersję. Co jeśli powiedzieliby, że glvalue jest zawsze akceptowalna zamiast wartości. Czy to zdanie rzeczywiście miałoby inne znaczenie? Na przykład czytamy, że lwartości i wartości x są przykładami wartości. Nie czytamy, że wartości i wartości x są wymienialne na wartości. Czy istnieje różnica w znaczeniu?

Przed moim pierwszym spotkaniem z tą terminologią, użyłem do modelowania wartości l i rvalues ​​mentalnie mniej więcej w następujący sposób: „lwartości sązawsze mogą działać jako wartości, ale dodatkowo mogą pojawiać się po lewej stronie=i na prawo od&

Jest to dla mnie intuicyjne zachowanie, że jeśli mam nazwę zmiennej, to mogę umieścić tę nazwę wszędzie tam, gdzie chciałbym umieścić literał. Model ten wydaje się spójny z terminologią niejawnych konwersji lwartości na wartość rwali używaną w standardzie, o ile zagwarantowana jest ta niejawna konwersja.

Ale ponieważ używają tej terminologii, zacząłem się zastanawiać, czy nieuchronna konwersja wartości l-wartości do wartości może się nie powieść w niektórych przypadkach. To znaczy, może mój umysłowy model jest tutaj błędny. Oto odpowiednia część standardu: (dzięki komentatorom).

Kiedy glvalue pojawia się w kontekście, w którym oczekiwana jest wartość, glvalue jest konwertowana na wartość prvalue; patrz 4.1, 4.2 i 4.3. [Uwaga: Próba powiązania odniesienia wartości r do wartości l nie jest takim kontekstem; patrz 8.5.3. - Uwaga końcowa]

Rozumiem, co opisują w notatce:

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). 

Więc moje pytanie brzmi (są):

1) Czy ktoś mógłby wyjaśnić konteksty, w których ta konwersja może się wydarzyć pośrednio? W szczególności, czy poza kontekstem powiązania z odniesieniem do wartości rvalue, istnieją inne, w których konwersje wartości l-r-wartości nie zdarzają się domyślnie?

2) Również w nawiasie[Note:...] w klauzuli wydaje się, że moglibyśmy to zrozumieć z wcześniejszego zdania. Która część standardu byłaby taka?

3) Czy to oznacza, że ​​powiązanie rvalue-reference nie jest kontekstem, w którym spodziewamy się wyrażenia prvalue (po prawej)?

4) Czy w przypadku innych konwersji konwersja glvalue-to-prvalue wymaga pracy w czasie wykonywania, która pozwoliłaby mi ją obserwować?

Moim celem nie jest pytanie, czy pożądane jest umożliwienie takiej konwersji. Próbuję nauczyć się tłumaczyć sobie zachowanie tego kodu, używając standardu jako punktu wyjścia.

Dobrą odpowiedzią byłby cytat, który umieściłem powyżej, i wyjaśnienie (na podstawie analizy tekstu), czy notatka w nim zawarta jest również niejawna z jego tekstu. Może wtedy dodamy inne cytaty, które pozwolą mi poznać inne konteksty, w których ta konwersja może się nie powieść pośrednio, lub wyjaśnić, że takich kontekstów już nie ma. Być może ogólna dyskusja o tym, dlaczego glvalue do prvalue jest uważana za konwersję.

questionAnswers(2)

yourAnswerToTheQuestion