7

Dlaczego nie mogę zwrócić unique_ptr z pary?Dlaczego nie mogę zwrócić unique_ptr z pary?

#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; 
} 

Kiedy próbuję skompilować to z g ++ 4.6, otrzymuję:

../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 

Nie rozumiem komunikat o błędzie

+1

'std :: unique_ptr' jest tylko przeniesieniem. – chris

+0

jak to się nie porusza? – dspyz

Odpowiedz

9

std::unique_ptr nie posiada konstruktor kopiujący, oraz sposób w którym go zwracasz (jako członek obiektu lokalnego) nie kwalifikuje się do automatycznego przenoszenia. W tym przypadku musisz ręcznie określić ruch.

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

Skąd mam wiedzieć, co kwalifikuje się do automatycznego przenoszenia? – dspyz

+1

@dspyz: Daj mi chwilę na sprawdzenie referencji, ale są to te same warunki, które kwalifikują ją do optymalizacji wartości zwracanej. –

+6

@dspyz: Sprawdź 12,8 paragrafy 31 i 32: http://isocpp.org/files/papers/N3797.pdf –

Powiązane problemy