Что означает, что x имеет ссылочный тип rvalue, но выражение x является lvalue?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Что означает, что x имеет ссылочный тип rvalue, но выражение x является lvalue?

Сообщение Anonymous »


Люди приходят в замешательство, когда слышат это в

int&& x x имеет ссылочный тип rvalue, но x является lvalue. Недоразумения возникают из-за того, что идентификаторы и выражения — это разные вещи, равно как и типы и категории значений. Более того, типы выражений «корректируются перед дальнейшим анализом», а слова «rvalue» и «lvalue» могут появляться как в имени типа, так и в названии категории значений.

Я хочу уточнить формальные определения. Предположим, у нас есть функция:

1 | пустота f(int&& x) { 2 | ... = х; 3 | ... = std::move(x); 4 | } Правильны ли следующие утверждения?
[*]В строке 1 x — это идентификатор (id-выражение), который называет параметр функции. Его тип — int&&, и именно этот тип возвращает decltype(x). x не является выражением и не имеет категории значений. [*]В строке 2 x — это выражение. До настройки типа его тип — int&&, а после тип становится int. Категория значения – lvalue. [*]В строке 3 std::move(x) — это выражение. Его тип до настройки — int&&, после — int. Категория значения — xvalue. [*]Когда мы говорим, что x имеет ссылочный тип rvalue, мы ссылаемся либо на тип x как идентификатор, либо на тип x как выражение перед настройкой типа. [*]Слово «тип» в утверждении «Каждое выражение имеет какой-то нессылочный тип, и каждое выражение принадлежит ровно к одной из трех основных категорий значений» на сайте cppreference.com относится к типу после корректировки типа. > [*]Когда Скотт Мейерс пишет: «Если тип выражения является ссылкой на lvalue (например, T& или const T& и т. д.), это выражение является lvalue. " он относится к типу до корректировки, а второе слово «lvalue» относится к категории значения.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»