Является ли выражение, которое выделяет выражение rvalue памяти или выражение lvalue?
Скажем, у меня есть следующий код
int main(){
new int; // Is this expression l-value or r-value??
return 0;
}
Я знаю, что lvalues являются постоянным объектом (поскольку он имеет определенное место в памяти, откуда мы можем получить доступ к последнему даже после окончания выражения), а rvalues - временный объект (ему нет места в памяти и испаряется после окончания выражения).
Я видел, где это выражение rvalue. Как это может быть rvalue, если выражение возвращает адрес (определенное место в памяти). Или это значение rvalue, потому что когда-либо выражение new int возвращает (значение адреса), оно исчезает и никогда не может быть поймано после окончания выражения.
Ответы
Ответ 1
new int
является r-значением.
Вы не можете использовать:
int i;
(new int) = &i;
Возможно, вы думаете об объекте, адрес которого возвращается new int
.
Выражение, обозначающее объект, адрес которого возвращается, *(new int)
, является значением l. Вы можете использовать:
*(new int) = 10;
Это не хороший код. Это утечка памяти, но это легальный код.