2016-08-08 13 views
10

Lassen Sie sagen, ich den folgenden CodeIst der Ausdruck, der den Speicher rvalue-Ausdruck oder lvalue-Ausdruck zuweist?

int main(){ 
    new int; // Is this expression l-value or r-value?? 

    return 0; 

} 

Ich weiß, dass L-Werte sind persistente Objekt haben (da sie von bestimmten Ort in Erinnerung hat, wo wir letztere zugreifen können, selbst nachdem der Ausdruck endet) und rvalues ​​sind temporäre Objekt (es hat keinen Platz in der Erinnerung und verdampft, nachdem der Ausdruck endet).

Ich sah einige, wo es rvalue Ausdruck ist. Wie kann es rvalue sein, wenn der Ausdruck eine Adresse (eine bestimmte Stelle im Speicher) zurückgibt. Oder ist es rvalue, denn was auch immer der Ausdruck new int zurückgibt (ein Adreßwert), verschwindet er und könnte niemals wieder aufgefangen werden, nachdem der Ausdruck beendet ist.

Antwort

14

new int ist ein r-Wert.

können Sie nicht verwenden:

int i; 
(new int) = &i; 

Vielleicht des Objekts Sie Adresse, die denken von new int zurückgeführt wird. Der Ausdruck, der das Objekt angibt, dessen Adresse zurückgegeben wird, *(new int), ist ein l-Wert. Sie können verwenden:

*(new int) = 10; 

Das ist kein guter Code. Es verliert Speicher, aber es ist legaler Code.

+5

Wenn ich es richtig verstehe, ist es ein R-Wert vor C++ 11 und ein pr-Wert nach C++ 11, oder? – Rakete1111

+1

@ Rakete1111, ja es ist ein Prvalue ab C++ 11. –

+1

@ Rakete1111 prvalues ​​sind eine Untermenge von rvalues, also könnte man sagen, dass es in allen Versionen ein rvalue war. –

Verwandte Themen