Какие значения имеют имена? - PullRequest
13 голосов
/ 28 мая 2011

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

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

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

Ответы [ 2 ]

9 голосов
/ 29 мая 2011

Один заметный случай - это перечислители

enum arity { one, two };

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

template<int *P> struct A { };

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

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

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

...