Чому типи виразів змінювались у C ++ між версіями?


13

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

Далі я посилаюся на такі проекти:

  • C ++ 11 [ n3690 ] (остаточний чернетка)
  • C ++ 17 [ n4659 ] (остаточний чернетка)
  • C ++ 20 [ n4835 ] (поточна чернетка)

C++11 3.10 Значення та оцінки

... Перше значення ("чисте" значення) - це оцінку, яка не є xvalue. [Приклад: Результат виклику функції, тип повернення якої не є посиланням, є первинним значенням. Значення буквального типу, такого як 12, 7.3e5 або true, також є першим значенням. - кінцевий приклад]

C++17 3.10 Значення та оцінки

... Першазна - це вираз, оцінка якого ініціалізує об'єкт або бітове поле, або обчислює значення операнду оператора, визначене контекстом, у якому він з'являється.

C++20 7.2.1 Категорії цінності *

... Перше значення - це вираз, оцінка якого ініціалізує об'єкт або бітове поле або обчислює значення операнду оператора, визначене контекстом, у якому він відображається, або вираз, який має тип cv void.

Я розумів би зміни в формулюванні, і деякі корективи вносяться, але для мене все визначення змінюється. Може хтось допоможе мені зрозуміти це? Наприклад, чому було вилучено речення про те, що prvalue - це ревальє, що не є xvalue? Або чому корисний приклад видалили?


3
Я все за те, щоб заборонити теги, що стосуються мовної версії. За винятком саме таких питань.
curiousguy


" не враховуйте, що формулювання та визначення між версіями C ++ сильно змінюються. " Але визначення насправді не змінилося. Досить великий вираз, який був первинним значенням у C ++ 11, як і раніше, є першим значенням у C ++ 20.
Ніколь

Де між версією "суперечливість (іон)"? Яке саме ваше запитання?
Галігатор

1
Вибачте за зміну C ++ 20 , але я помітив невідповідність стандарту.
Маджієро

Відповіді:


5

Оригінальне визначення першого значення було лише міткою: ми відкладаємо певні rvalues ​​(а саме ті, що не є xvalues) і даємо їм ім’я. Зайняти їхню адресу неможливо, окрім незвичногоthis використання (більш-менш тому, що вони тимчасові), тому певні свободи можна взяти за їх створення та поширення, не порушуючи нічого. (Див. Також недавню дискусію про них, що не мають "особистих даних".)

Нове визначення прямо говорить про те, що prvalue - це ініціалізація, яка «чекає, що відбудеться»: як тільки ідентифікується цільовий об’єкт для нього, він стає ініціалізованим. (Важливо зазначити, що ініціалізація все ще відбувається коли спочатку побудовано перше значення, а не там, де воно є.) Це походить під назвою "обов'язковий елісіон копії" на основі еквівалентної оптимізації, яка вже була загальною.

Що стосується прикладу, то нові визначення ціннісних категорій розглядалися як настільки простіші, що потрібно було менше прикладів. Є ще один для xvalues ​​(які є найтоншою категорією).


Дякую вам і коментаторам! Це майже все це пояснює!
Даніель Стівенс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.