Ad esempio, std::vector<int&> vec_int;
sembra non essere valido in C++. Perché questo è invalido?Perché non posso utilizzare i tipi di riferimento come tipo di valore di un tipo di contenitore?
risposta
Risposta, come da richiesta chryspi sopra. Come commentato in altre risposte, non è possibile utilizzare i riferimenti direttamente come riferimenti non esistono da soli.
È possibile utilizzare riferimenti, tuttavia, ma mediante la classe boost::reference_wrapper<T>
utility:
typedef boost::reference_wrapper<int> intref;
std::vector<intref> v;
int i;
i = 9;
v.push_back (boost::ref (i)); // store &i
int& j = v[0];
j = 10;
//v[0].get() = 10;
std::cout << i << std::endl; // prints 10
ho messo come esempio come modificare direttamente l'elemento v[0]
. Tieni presente che è alquanto complicato (devi chiamare il metodo get()
) perché ottieni un boost::reference_wrapper<T>
anziché un riferimento effettivo.
Per memorizzare i puntatori in modo sicuro rispetto alla memoria, è possibile utilizzare boost::shared_ptr
allo stesso modo.
I contenitori STL devono essere in grado di creare oggetti con il costruttore predefinito. Non puoi farlo con un riferimento. Un riferimento è garantito valido, quindi deve sempre essere inizializzato con l'assegnazione.
È necessario utilizzare un puntatore.
C'è un altro motivo. I riferimenti non possono essere assegnati. Credo che ':: std :: vector' richieda che la cosa memorizzata in esso sia assegnabile. – Omnifarious
Due note qui. Si può anche usare 'boost :: ref' per memorizzare i riferimenti nei contenitori. E sui puntatori, anche 'boost :: shared_ptr' per salvarli in sicurezza. allocazione della memoria. –
Assegnabilità è probabilmente il colpevole qui. AFAIK, i contenitori non richiedono il costruttore predefinito, a meno che non si chiamino metodi che lo usano (ad esempio 'resize()' con il valore predefinito e simile). – visitor
Internamente, un vector<T>
utilizza una matrice per memorizzare una sequenza di oggetti T
. Poiché i riferimenti non sono oggetti, non esiste una serie di riferimenti (vedere 8.3.2 §5 nello standard), quindi i tipi di riferimento non possono essere utilizzati per parametrizzare il modello vector
.
Quello che si desidera è un vettore di puntatori intelligenti come std::vector<boost::shared_ptr<T> >
o un contenitore di puntatori dedicato come boost::ptr_vector<T>
.
- 1. Un tipo può essere un tipo di riferimento e un tipo di valore allo stesso tempo?
- 2. Definizione del vincolo del tipo di interfaccia generico per i tipi di valore e di riferimento
- 3. Valore Tipo Vs Tipo di riferimento - Oggetto Classe C#
- 4. Perché non possiamo bloccare un tipo di valore?
- 5. È possibile utilizzare un tipo di riferimento come tipo di chiave in una mappa STL
- 6. Perché i tipi di riferimento di boxe?
- 7. Come indicizzare un tipo di "elemento" con un valore di "contenitore di origine"?
- 8. Perché i tipi di riferimento non sono inizializzati su null?
- 9. associazione di riferimento a un valore di tipo drops qualificatori
- 10. I tipi Null sono tipi di riferimento?
- 11. Memorizza un riferimento a un tipo di valore?
- 12. L'oggetto è un tipo di riferimento o un tipo di valore?
- 13. Quando è utile un tipo di valore/vincolo di tipo di riferimento in C#?
- 14. Non è possibile assegnare un valore di tipo 'NSArray' per un valore di tipo '[ANYOBJECT]'
- 15. di riferimento non-const di tipo da un rvalue
- 16. semantica del tipo di ritorno di riferimento valore-r?
- 17. OpenMP atomico su un tipo di riferimento?
- 18. Come posso vincolare un tipo (tipo?) Solo ai tipi di prodotto
- 19. Tipo di tipi personalizzati di trasmissione per tipi di base
- 20. domanda riguardo al valore di tipo/di riferimento di eventi
- 21. Dato un valore di un tipo dipendente dal percorso, come posso ottenere un'istanza del "contenitore"?
- 22. Perché System.Enum non è un tipo di valore?
- 23. Tipi di valore e riferimento
- 24. Utilizzo del riferimento come tipo di modello
- 25. I tipi di riferimento in diretta sullo heap, i tipi di valore in diretta sullo stack
- 26. Come verificare se un tipo di modello è uno dei tipi di un tipo di variante?
- 27. Unità: come specificare di utilizzare un'istanza specifica di un tipo quando si risolve un altro tipo
- 28. I tipi di valore ereditano da System.Object ... perché?
- 29. C# - Perché non posso passare una classe dichiarata in un'istruzione using come un tipo di riferimento?
- 30. Perché non posso utilizzare selettori di record con un tipo quantificato in modo esistenziale?
si dovrebbe rinominare questo "Perché non posso usare" ... – Philipp