7

Perché non posso restituire un unique_ptr da una coppia?Perché non posso restituire un unique_ptr da una coppia?

#include <iostream> 
#include <memory> 
#include <utility> 

using namespace std; 

unique_ptr<int> get_value() { 
    pair<unique_ptr<int>, int> p(unique_ptr<int>(new int(3)), 4); 
    return p.first; 
} 

int main(void) { 
    cout << *get_value() << endl; 
    return 0; 
} 

Quando provo a compilare questo con g ++ 4.6, ottengo:

../main.cpp: In function ‘std::unique_ptr<int> get_value()’: 
../main.cpp:9:11: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int, _Dp = std::default_delete<int>, std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]’ 
/usr/include/c++/4.6/bits/unique_ptr.h:256:7: error: declared here 
make: *** [main.o] Error 1 

non capisco il messaggio di errore

+1

'std :: unique_ptr' è solo su spostamento. – chris

+0

in che modo questo non è solo movimento? – dspyz

risposta

9

std::unique_ptr non ha un costruttore di copia, e il modo in cui in cui lo stai restituendo (come membro di un oggetto locale) non si qualifica per lo spostamento automatico. In questo caso è necessario specificare lo spostamento manualmente.

return std::move(p.first); 
+0

Come faccio a sapere cosa qualifica per lo spostamento automatico? – dspyz

+1

@dspyz: Dammi un minuto per cercare il riferimento, ma sono le stesse condizioni che lo qualificano per l'ottimizzazione del valore di ritorno. –

+6

@dspyz: Controlla 12.8 paragrafi 31 e 32: http://isocpp.org/files/papers/N3797.pdf –