Какие rvalues имеют имена?
@FredOverflow, упомянутый в чате С++, который this
является редким случаем rvalues с именами. С++ 0x FDIS упоминается в 5.1.1 [expr.prim.general] p4
:
В противном случае, если член-декларатор объявляет нестатический элемент данных (9.2) класса X, выражение this
является значением класса "указатель на X" внутри необязательного скобки или равно-инициализатор. Он не должен появляться в другом месте в деклараторе участника. (акцент мой)
Что там есть, если есть?
Ответы
Ответ 1
Одним из важных случаев являются перечисления
enum arity { one, two };
Выражения one
и two
являются значениями r (точнее, prvalues в С++ 0x). Другими являются нестандартные параметры шаблона
template<int *P> struct A { };
Выражение P
также является rvalue (более конкретно, prvalue в С++ 0x).
Ответ 2
- Булевские литералы
true
и false
являются значениями типа bool.
-
nullptr
- это prvalue типа nullptr_t
.
- Когда вы возвращаете именованную переменную из функции, она становится
xvalue
в контексте этого выражения, а xvalue
- rvalue
(в §3.10/1).
Может быть больше, но это все, о чем я могу думать в данный момент (и третий сомнительный - это действительно выражение, что значение x, но с чем-то вроде return x;
(где x
является локальным переменная, и вы возвращаете значение, а не ссылку), имя переменной - это выражение. Имя действительно относится к glvalue, а в выражении, которое значение (но не действительно имя) преобразуется в значение xvalue ( который является rvalue).