2016-05-30 11 views
6

Poiché C++ fornisce riferimenti a rvalue, cioè riferimenti rvalue che vengono principalmente utilizzati per eseguire semantica del movimento e altre attività di memoria efficienti. Ma nel caso seguente il riferimento sta cambiando il valore di un letterale, ma come sappiamo che i letterali sono letti solo così come potrebbe un riferimento cambiare il valore di alcune variabili di sola lettura. Un riferimento di rvalue alloca la propria memoria o semplicemente modifica il valore letterale?C++: memoria di riferimento rvalore

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 5; 
    int&& b = 3; 
    int& c = a; 
    b++; 
    c++; 
    cout << " Value for b " << b << " Value for c " << c << endl; 
} 

In secondo luogo, quando un oggetto temporaneo viene assegnato con un riferimento, il riferimento funziona con i dati di quell'oggetto. Ma secondo la definizione di oggetti temporanei vengono cancellati come quando termina l'espressione che li usa. In che modo il riferimento può fungere da alias per quell'oggetto temporaneo se quell'oggetto temporaneo non ha memoria?

risposta

12

I valori letterali numerici non possono essere associati a nessun riferimento, né a un riferimento di rvalore né a un riferimento di lvalue. Concettualmente, un valore letterale numerico crea un oggetto temporaneo inizializzato dal valore letterale e questo temporaneo può essere associato a un riferimento rvalue oa const lvalue reference (int const& r = 17;). Sembra che la citazione pertinente sui letterali sia 5.1.1 [expr.prim.general] paragrafo 1:

Un letterale è un'espressione primaria. Il suo tipo dipende dalla sua forma (2.14). Una stringa letterale è un lvalue; tutti gli altri letterali sono prvali.

Quando si associa un riferimento direttamente a un temporaneo, la sua durata viene estesa fino a quando il riferimento non rientra nello scope. La sezione pertinente per il problema del tempo di vita è 12.2 [class.temporary] paragrafo 5:

Il secondo contesto è quando un riferimento è associato a un temporaneo. La temporanea in cui il riferimento è associato o temporaneo cioè l'oggetto completo di un oggetto secondario a cui è vincolato il riferimento persiste per tutta la durata del riferimento eccetto:

  • Un temporaneo legato ad un organo di riferimento in un il costruttore di inizializzatore del costruttore (12.6.2) persiste fino alla chiusura del costruttore.
  • Un collegamento temporaneo a un parametro di riferimento in una chiamata di funzione (5.2.2) persiste fino al completamento dell'espressione completa che contiene la chiamata.
  • La durata di un vincolo temporaneo al valore restituito in una dichiarazione di ritorno funzione (6.6.3) non è estesa; il temporaneo viene distrutto alla fine dell'espressione completa nella dichiarazione di reso.
  • Un riferimento temporaneo a un riferimento in un nuovo inizializzatore (5.3.4) persiste fino al completamento dell'espressione completa contenente il nuovo inizializzatore.
+0

Hey da cui riferimento si fa a dire i numeri di sezione come '(5.1.1) il paragrafo 1' –

+1

@HarshulSharma: Sto citando lo standard C++ in atto al momento del post. Nel caso di questo articolo che è ISO/IEC 14882: 2014. Questi documenti possono essere acquistati da organizzazioni nazionali di standardizzazione. Alcuni _draft_ sono disponibili (vedere la pagina [open std] (http://www.open-std.org/JTC1/SC22/WG21/) per alcuni collegamenti). I miei riferimenti includono normalmente sia il numero di sezione che il riferimento_table come "[expr.prim.general]": il numero di sezione, la dicitura esatta ei numeri di paragrafo possono cambiare ma rimangono i riferimenti stabili. Il testo citato utilizza il riferimento come nel testo citato. –

+0

Grazie non sapevo che WG21 pubblica anche una bozza finale. Ho solo pensato che rilasciassero diverse bozze per concetti diversi. Ora penso di avere un riferimento affidabile.Grazie mille :) :) –

Problemi correlati