Ho scritto il seguente codice in cui provo a copiare il valore dell'oggetto unique_ptr
in una struttura.Copia del valore di std :: unique_ptr tramite dereferencing
#include <iostream>
#include <memory>
using namespace std;
struct S {
S(int X = 0, int Y = 0):x(X), y(Y){}
// S(const S&) {}
// S& operator=(const S&) { return *this; }
int x;
int y;
std::unique_ptr<S> ptr;
};
int main() {
S s;
s.ptr = std::unique_ptr<S>(new S(1, 4));
S p = *s.ptr; // Copy the pointer's value
return 0;
}
Si apre errori in Visual C++ 2012:
IntelliSense: nessuna conversione definita dall'utente adatto da "S" a "S" esiste
IntelliSense: nessun operatore "=" le partite questi operandi tipi operandi sono: std :: unique_ptr> = std :: unique_ptr>
errore C2248: 'std :: unique_ptr < _Ty> :: unique_ptr': non può accedere membro privato dichiarato nella classe 'std :: unique_ptr < _Ty>'
A meno che non annulli le righe in cui ho tentato di definire un costruttore di copia e un operatore. Questo elimina gli errori del compilatore ma non gli errori di IntelliSense. Si compila indipendentemente dagli errori di IntelliSense visualizzati nell'elenco degli errori.
Quindi, perché non è possibile utilizzare solo le funzioni predefinite e compilarle? Sto facendo la copia del valore nel modo giusto? Come dovrei definire il costruttore di copie se ne ha bisogno?
Non c'è davvero modo di copiare il valore del puntatore anche su un oggetto stack senza sacrificarlo? Con questo intendo di lasciare solo le informazioni 'ptr', e solo di copiare i valori di' x' e 'y'. – cpx
@cpx L'intero punto di un 'unique_ptr' è che è univoco, quindi nessun altro oggetto può scrivere nella memoria del puntatore. Se vuoi che più di un oggetto faccia riferimento alla memoria, devi usare la classe appropriata, probabilmente un 'shared_ptr'. – IllusiveBrian
È possibile copiare i dati indicati da 'unique_ptr' e inserire la build che copia all'interno di un nuovo' unique_ptr'. Direi che è perfettamente ragionevole anche. Il puntatore originale è ancora 'unico', ancora l'unico puntatore a quell'oggetto originale. Va bene avere un altro puntatore a un oggetto * diverso * con lo stesso valore. Per esempio. 'auto x1 = make_unique (7); auto x2 = make_unique (7); '** Ma **, porterà a slicing (e forse comportamento indefinito) se si tenta di copiare il valore in un' unique_ptr ' che in realtà sta puntando a un 'Derived'. (Ci sono anche soluzioni alternative.) –