Dlaczego typy wyrażeń zmieniły się w C ++ między wersjami?

13

Próbuję zrozumieć typy wyrażeń C ++, a im więcej czytam, tym bardziej byłem zdezorientowany, ponieważ uważam, że szkic C ++ jest bardzo trudny do strawienia, dlatego wolę inne zasoby, ale albo one są sobie sprzeczne, albo nie biorą pod uwagę, że brzmienie i definicja między wersjami C ++ mocno się zmienia.

Poniżej odnoszę się do następujących szkiców:

  • C ++ 11 [ n3690 ] (wersja ostateczna)
  • C ++ 17 [ n4659 ] (wersja ostateczna)
  • C ++ 20 [ n4835 ] (aktualny projekt)

C++11 3.10 Wartości lv i wartości

... Wartość („czysta” wartość) to wartość, która nie jest wartością x. [Przykład: Wywołanie funkcji, której typem zwracanym nie jest odwołanie, jest prvalue. Wartość literału, takiego jak 12, 7,3e5, lub prawda, jest również wartością wstępną. - koniec przykładu]

C++17 3.10 Wartości lv i wartości

... Wartość jest wyrażeniem, którego ocena inicjuje obiekt lub pole bitowe lub oblicza wartość operandu operatora, zgodnie z kontekstem, w którym się pojawia.

C++20 7.2.1 Kategorie wartości *

... Wartość jest wyrażeniem, którego ocena inicjuje obiekt lub pole bitowe lub oblicza wartość argumentu operatora określonego w kontekście, w którym się pojawia, lub wyrażenie typu cv void.

Zrozumiałbym zmiany w brzmieniu i dokonano pewnych korekt, ale dla mnie zmienia się cała definicja. Czy ktoś może mi pomóc to zrozumieć? Na przykład dlaczego usunięto zdanie, że wartość jest wartością, która nie jest wartością x? Lub dlaczego pomocny przykład został usunięty?

Daniel Stephens
źródło
3
Jestem za banowaniem tagów językowych specyficznych dla wersji. Z wyjątkiem dokładnie tego rodzaju pytań.
ciekawy
nie bierz pod uwagę, że brzmienie i definicja między wersjami C ++ mocno się zmieniają. ” Ale definicja tak naprawdę się nie zmieniła. Prawie wyrażenie, które było prvalue w C ++ 11, wciąż jest prvalue w C ++ 20.
Nicol Bolas
Gdzie jest „sprzeczność (jon)” między wersjami? Jakie dokładnie jest twoje pytanie?
Galigator
1
Przepraszam za zmianę C ++ 20 , ale zauważyłem niespójność w standardzie.
Maggyero,

Odpowiedzi:

5

Oryginalna definicja wartości była tylko etykietą: odłożyliśmy na bok pewne wartości (a mianowicie te, które nie są wartościami) i nadaliśmy im nazwę. Nie można wziąć ich adresu, chyba że przez nietypowe thisużycie (mniej więcej dlatego, że są one tymczasowe), więc pewne swobody można wykorzystać przy ich tworzeniu i rozpowszechnianiu, nie niszcząc niczego. (Zobacz także niedawną dyskusję o tym, że nie mają „tożsamości”).

Nowa definicja wyraźnie mówi, że wartość jest inicjalizacją „czekającą na wystąpienie”: gdy zostanie dla niej zidentyfikowany obiekt docelowy, inicjowana jest ona. (Ważne jest, aby pamiętać, że inicjalizacja nadal ma miejsce, gdy konstruowana jest wartość prawdy, ale nie tam , gdzie ona jest.) To się nazywa „obowiązkowe wymuszanie kopii” w oparciu o równoważną optymalizację, która była już powszechna.

Na przykład nowe definicje kategorii wartości były postrzegane jako o wiele prostsze, dlatego potrzebnych było mniej przykładów. Jest jeszcze jeden dla wartości X (które są najsubtelniejszą kategorią).

Davis Herring
źródło
Dzięki tobie i komentatorom! To właściwie wyjaśnia!
Daniel Stephens