int x = 8;
int y = x ;
Вот как lvalue может выступать в качестве rvalue? Я знаю, что это глупый вопрос, но я просто хочу прояснить мои концепции относительно rvalue и lvalue.
Через именующий в Rvalue преобразование.
Вы можете использовать именующий почти везде, где Rvalue требуется и неявный именующий в Rvalue преобразование произойдет автоматически.
Неформально это преобразование «оценивает» или «принимает значение» объекта, который именующий относится к. Это не совсем верно во всех случаях; в неоцененных контекстах, таких как операнд sizeof
значение объекта не будет использовано.
ISO / IEC 14882: 2011 4.1 [conv.lval]:
Glvalue (3.10) нефункционального типа, не являющегося массивом
T
может быть преобразован в prvalue. ЕслиT
является неполным типом, программа, которая требует этого преобразования, плохо сформирована. Если объект, на который ссылается glvalue, не является объектом типаT
и не является объектом типа, полученного изT
или, если объект не инициализирован, программа, которая требует этого преобразования, имеет неопределенное поведение. ЕслиT
это тип, не относящийся к классу, тип prvalue — версия cv-unqualifiedT
, В противном случае тип prvalueT
,
Lvalue — это любое значение, которое может появиться в левой части назначения. Что-то, что может быть назначено, например, переменная x
в этом случае. Rvalues это вещи, которые имеют значение, например, 8
или получить значение x
, Вы можете думать о lvalues как о подмножестве значений rvalue, то есть все значения lvalue могут запрашиваться и использоваться как значение rvalue.