2016-01-13 21 views
7

Nella moderna C++ possiamo inizializzare un vettore come questo:Creazione di uno shared_ptr di vettore in C++

std::vector<int> v = { 1, 2, 3, 4, 5 }; 

Ma se provo la creazione di un puntatore intelligente per un vettore, questo non verrà compilato:

auto v = std::make_shared<std::vector<int>>({ 1, 2, 3, 4, 5 }); 

Esiste un'alternativa migliore del ricorso a push_back s dopo la creazione?

+5

Perché vuoi il vettore sull'heap? I dati nel vettore sono già nell'heap, quindi la dimensione del vettore sullo "stack" è piuttosto ridotta. – NathanOliver

+0

C'è un vettore membro 'classe' privato in una classe e lo espongo ad altre classi tramite un getter. Quindi, invece di passarlo per valore, restituisco un 'shared_ptr' ad esso. – Crossfire

+2

Quindi restituirlo per riferimento. – NathanOliver

risposta

10
auto v = std::make_shared<std::vector<int>>(std::initializer_list<int>{ 1, 2, 3, 4, 5 }); 

Ciò sta funzionando. Sembra che il compilatore non possa mangiare {} nei parametri make_unique senza una specifica diretta di initializer_list.

Modifica minore - usato MSVC 2015

+0

Funziona alla grande! Strano perché il compilatore non ha potuto inferire il tipo. – Crossfire

+5

@Crossfire Ciò è dovuto al fatto che una lista di inizializzazione rinforzata non ha alcun tipo. – NathanOliver

+0

Inserendo questo come commento mentre la domanda è chiusa; puoi anche fare che 'auto è = {1, 2, 3, 4, 5}; auto v = std :: make_shared > (è); '. 'auto' deduce sempre un' braced-init-list' da essere un 'std :: initializer_list'. – Simple

2

alternativa è possibile farlo creando un altro vettore direttamente parametro per spostarlo:

auto v = std::make_shared<std::vector<int>>(std::vector<int>({ 1, 2, 3, 4, 5 })); 
+1

Quindi stai usando un 'std :: initializer_list' per inizializzare-costruire un' std :: vector' che è usato per copiare-costruire un 'std :: vector' che è racchiuso in un' std :: shared_ptr'. Strano. Interessante. Legit, comunque. – TobiMcNamobi

+1

@TobiMcNamobi Per essere pignoli: move-construct, non copy-construct. – emlai

+1

@zenith C++ è potente, complesso e complicato. Non è schizzinoso, ma è molto importante parlare dei dettagli. In effetti, i dettagli sono ciò di cui parla l'intero sito, non è vero? Quindi grazie! – TobiMcNamobi

Problemi correlati