Что означает, что x имеет ссылочный тип rvalue, но выражение x является lvalue? ⇐ C++
Что означает, что x имеет ссылочный тип rvalue, но выражение x является lvalue?
Люди приходят в замешательство, когда слышат это в
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» относится к категории значения.
Люди приходят в замешательство, когда слышат это в
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» относится к категории значения.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение