Какие rvalue имеют имена?

@FredOverflow упомянул в чате C++, что this — это редкий случай, когда rvalue имеют имена. C++0x FDIS упоминает под 5.1.1 [expr.prim.general] p4:

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

Какие еще есть, если есть?


person Xeo    schedule 28.05.2011    source источник
comment
Технически this, true и false не являются именами. Это токены, которые образуют допустимые выражения rvalue и выглядят как идентификаторы.   -  person aschepler    schedule 29.05.2011


Ответы (2)


Одним из ярких примеров являются счетчики

enum arity { one, two };

Выражения one и two являются rvalue (точнее, prvalue в C++0x). Другие параметры шаблона, не являющиеся типом

template<int *P> struct A { };

Выражение P также является значением r (точнее, значением prvalue в C++0x).

person Johannes Schaub - litb    schedule 28.05.2011
comment
Стандартные цитаты, чтобы поддержать это? (Я знаю, что он у тебя есть, не скрывай его от меня! :)) - person Xeo; 29.05.2011
comment
@Xeo Это 5.1.1p8 и 14.1p6 - person Johannes Schaub - litb; 29.05.2011

  1. Булевы литералы true и false являются значениями prvalue типа bool.
  2. nullptr — это значение типа nullptr_t.
  3. Когда вы возвращаете именованную переменную из функции, она становится xvalue в контексте этого выражения, а xvalue становится rvalue (согласно §3.10/1).

Их может быть больше, но это все, что я могу придумать на данный момент (и третье вызывает сомнения — это действительно выражение, являющееся значением x, но с чем-то вроде return x; (где x — локальная переменная, и вы возвращаете значение значение, а не ссылка), имя переменной является выражением. Имя действительно относится к glvalue, и в выражении это значение (но не имя) преобразуется в xvalue ( который является значением r).

person Jerry Coffin    schedule 28.05.2011
comment
Третий пункт относится только к локальным переменным, возвращаемым по значению. И даже в этом случае выражение по-прежнему является lvalue, но есть специальное языковое правило, которое обрабатывает объект как если бы он был обозначен rvalue. - person fredoverflow; 28.05.2011
comment
@FredOverflow: да - я отредактировал упоминание о том, что это должно быть локальным, чтобы все это применялось (и, как я уже сказал, я согласен, что третье в любом случае сомнительно). - person Jerry Coffin; 28.05.2011