Является ли выражение, которое выделяет выражение 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;

Это не хороший код. Это утечка памяти, но это легальный код.