Почему типы выражений менялись в C ++ между версиями? - PullRequest
7 голосов
/ 31 октября 2019

Я пытаюсь понять типы выражений в C ++, и чем больше я читаю, тем больше я запутался, так как нахожу черновик C ++ очень сложным для восприятия и поэтому предпочитаю другие ресурсы, но они либо противоречат друг другуили не принимайте во внимание, что формулировка и определение между версиями C ++ сильно изменяются.

Далее я ссылаюсь на следующие проекты:

  • C ++ 11 [ n3690 ] (окончательный вариант)
  • C ++ 17 [ n4659 ] (окончательный вариант)
  • C ++ 20 [ n4835 ] (текущий проект)

C++11 3.10 L-значения и значения

... Prvalue («чистое» значение) - этоrvalue, которое не является xvalue. [Пример: результат вызова функции, тип возвращаемой которой не является ссылкой, является предварительным значением. Значение литерала, такого как 12, 7.3e5 или true, также является prvalue. - конец примера]

C++17 3.10 Lvalues ​​и rvalues ​​

... prvalue - это выражение, оценка которого инициализирует объект или битовое поле, или вычисляетзначение операнда оператора, как определено контекстом, в котором он появляется.

C++20 7.2.1 Категории значений *

... Aprvalue - это выражение, вычисление которого инициализирует объект или битовое поле или вычисляет значение операнда оператора, как определено контекстом, в котором он появляется, или выражение, имеющее тип cv void.

Я бы понял изменения в формулировках, и некоторые изменения сделаны, но для меня изменилось все определение. Может ли кто-нибудь помочь мне понять это? Например, почему было удалено предложение о том, что prvalue - это rvalue, а не xvalue? Или почему был удален полезный пример?

1 Ответ

3 голосов
/ 01 ноября 2019

Первоначальное определение prvalue представляло собой просто метку: мы откладываем некоторые значения (а именно те, которые не являются значениями x) и присваиваем им имя. Невозможно получить их адрес, кроме как с помощью необычного this использования (более или менее потому, что они временные), поэтому определенные свободы можно использовать при их создании и распространении, не нарушая ничего. (См. Также недавнее обсуждение того, что они не «имеют идентичность».)

Новое определение явно говорит, что prvalue - это инициализация, «ожидающая выполнения»: как только целевой объект идентифицированэто то, что инициализируется. (Важно отметить, что инициализация по-прежнему происходит , когда построено значение prvalue, но не , где это.) Это называется «обязательное копирование» на основе эквивалентногоОптимизация, которая уже была распространена.

Что касается примера, то новые определения категорий значений были восприняты как гораздо более простые, что потребовалось меньше примеров. Существует еще один для xvalues ​​(которые являются самой тонкой категорией).

...