"Может ли кто-нибудь объяснить или указать мне какое-то объяснение, что такое R-Value? Я не совсем уверен, что это такое"
Термин lvalue первоначально относился к выражению, которое может быть левой рукой назначения. Соответственно, rvalue (хотя, насколько я помню, этот термин не использовался стандартом C89), изначально было прямо противоположным: выражение, которое не могло быть левой стороной присвоения, но могло только быть правой рукой.
C ++ 11 усложнил это, добавив еще несколько нюансов, но давайте сосредоточимся на значениях C ++ 03.
Например, если у вас есть
int x;
тогда присвоение x = 42
в порядке, поэтому x
является выражением lvalue.
В качестве контрпримера, присвоение x+0 = 42
не в порядке, поэтому x+0
является выражением rvalue.
Как и выражение 2+2
, это rvalue-выражение.
Итак, если требуется, чтобы ваша программа включала значение r, просто напишите 2+2
или, например, (более продвинутый) 6*7
, в main
.
Оригинал C не имел const
. В C ++ с const
вы должны игнорировать const
с целью обозначения выражения как lvalue или rvalue. Критическим моментом является то, относится ли гарантированное выражение к объекту в памяти, к объекту с адресом: если это так, то выражение является lvalue.
Ссылочный тип подразумевает lvalue, поскольку выражение ссылочного типа обязательно ссылается на объект с адресом памяти, то есть это выражение является lvalue.
Однако, кроме ссылок, между типом и lvalue / rvalue нет никакой связи. Например, x
и x+0
являются выражениями типа int
, и они дают одинаковое значение int
. Но первое является выражением lvalue, а второе - выражением rvalue.
Как правило, если вы можете применить встроенный оператор адреса, тогда это выражение lvalue, а в противном случае это выражение rvalue.