Что составляет RValues? - PullRequest
       77

Что составляет RValues?

0 голосов
/ 21 декабря 2011

RValues ​​- это вещи, которые не являются управляемыми областями памяти, поэтому литералы, такие как целые числа, считаются RValues.

  1. Являются ли константы RValues?const int x = 0; можно манипулировать по крайней мере один раз.
  2. Теперь временные объекты, созданные компилятором, также являются значениями RV, даже если они имеют области памяти, которые можно манипулировать.Почему это так?
    Поскольку они не могут быть изменены "пользователями"?Это причина?

Итак, область памяти, которой НЕ манипулируют "пользователи", называется RValue?

Ответы [ 7 ]

3 голосов
/ 21 декабря 2011
  1. Являются ли константы R-значениями?const int x = 0;можно манипулировать как минимум один раз.

В вашем объявлении x не является ни значением, ни значением, оно называется идентификатор-объявления .(См. Грамматику 8/4 в C ++ 03). Когда она используется в (под) выражении, это немодифицируемое lvalue, которое может быть инициализировано любым константным выражением .

2.Таким образом, временные объекты, созданные компилятором, также являются значениями RVal даже в тех случаях, когда они имеют управляемые области памяти.Почему это так?Потому что они не могут быть изменены "пользователями"?Это причина?

R-значение типа класса может быть либо модифицируемым, либо немодифицируемым, но значения встроенных типов всегда cv-неквалифицированными.

§3.10 / 9 Класс rvalues ​​может иметь cv-квалифицированные типы;неклассовые значения всегда имеют cv-неквалифицированные типы.

Рассмотрим этот пример:

struct S {
     int x;
     void f(int s) { x = s; }
};

// ill-formed: Cannot assign to an rvalue of built-in type.
S().x = 42;

// Valid: A member function can be used to modify the referent of rvalue.
S().f(42);

Подвыражение S() создает rvalue типа класса, время жизни которого равноконец чего-либо ; полное выражение.

3 голосов
/ 21 декабря 2011

Скалярные r-значения - это выражения, которые оцениваются в скалярные значения, такие как 42 или i + k (тогда как скалярные l-значения являются выражениями, которые оцениваются в скалярные объекты, такие как i или *int_ptr или numbers[0]).

Значения типа класса являются выражениями, которые оценивают временные объекты. Наиболее ярким примером является вызов функции, которая возвращает объект класса по значению:

std::string foo()
{
    return "hello world";
}

Учитывая приведенное выше определение функции, выражение foo() является r-значением. Обратите внимание, что я говорю не о результате (который является временным объектом), а о выражении foo(), оценка которого дает этот результат.

1 голос
/ 21 декабря 2011

lvalue относится к ячейке памяти, и мы можем взять адрес этой ячейки памяти с помощью оператора &. rvalue - это выражение, которое не является lvalue.

1. Do constants constitute RValues? const int x = 0; is maniputable at least one time.

Нет, потому что вы это делаете - const int *p = &x

0 голосов
/ 21 декабря 2011

RValue - это вещи, которые не являются управляемыми областями памяти

Неправильно. Значения абсолютно изменчивы. В C ++ 03 это является головной болью, но может быть сделано юридически - в C ++ 11 это очень распространено.

R-значения - это выражения, которые приводят к смерти. Это их определяющая собственность. Следовательно, вы можете украсть их ресурсы, не беспокоясь об этом, используя ссылки Rvalue в C ++ 11 или, если вы в отчаянии, «подкачаете» в C ++ 03. Это делает их более правильными во многих ситуациях и намного быстрее при многих, многих обстоятельствах.

0 голосов
/ 21 декабря 2011

RValue - это вещи, которые не являются управляемыми областями памяти

значения - это выражения, а не «вещи».

rvalues ​​ может ссылаться на объекты («управляемые области памяти»).

поэтому литералы, такие как целые числа, считаются значениями RV.

Литералы являются rvalue (не считаются "rvalues) , потому что C ++ определен таким образом .

Являются ли константы R-значениями?

const int x = 0;

На самом деле, x является переменной типа const int.

Учитывая приведенное выше определение x, выражение x является lvalue.

Теперь временные объекты, созданные компилятором, также являются RValues ​​

Нет, значения - это выражения, не объекты .

даже когда они имеют манипулируемые области памяти. Почему это так?

Это не так.

Потому что они не могут быть изменены "пользователями"? Это причина?

rvalues ​​являются rvalues, потому что язык определяется таким образом.

Итак, область памяти, которой НЕ манипулируют "пользователи", называется RValue?

Нет, rvalue обозначает только выражения, а не вещи, которые существуют во время выполнения, например память.

Значение r иногда может ссылаться на объект, который является «областью памяти», которой может манипулировать пользователь.

область памяти, которой НЕ могут манипулировать "пользователи"

Не ясно, что вы имеете в виду здесь; Вы имеете в виду постоянную память или что-то еще?

0 голосов
/ 21 декабря 2011

Прежде всего - lval и rval - это свойства выражений - выражение является либо rval, либо lval.

Чтобы ответить на другой вопрос, временные данные , созданные с помощью rval, можно изменить, используя ссылку на rval - эта функция добавлена ​​в c ++ 11

Эта функция очень полезна для 1) применения семантики перемещения 2) идеальной пересылки.

Подробнее об этом можно узнать на http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

0 голосов
/ 21 декабря 2011
  1. Все переменные, включая немодифицируемые (постоянные) переменные, являются lvalues.Таким образом, x - это l-значение, тогда как 0 - это r-значение.

  2. Временные объекты становятся значениями, поскольку они не существуют за пределами этого конкретного оператора.

Вы можете прочитать подробнее здесь

...