Почему я не могу вернуть unique_ptr из пары?

Почему я не могу вернуть unique_ptr из пары?

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

Когда я пытаюсь скомпилировать это с помощью g++ 4.6, я получаю:

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

Я не понимаю сообщение об ошибке


person dspyz    schedule 18.12.2013    source источник
comment
std::unique_ptr предназначен только для перемещения.   -  person chris    schedule 18.12.2013
comment
как это не только для движения?   -  person dspyz    schedule 18.12.2013


Ответы (1)


std::unique_ptr не имеет конструктора копирования, и способ, которым вы его возвращаете (как член локального объекта), не подходит для автоматического перемещения. В этом случае вам нужно указать ход вручную.

return std::move(p.first);
person Benjamin Lindley    schedule 18.12.2013
comment
Как узнать, что подходит для автоматического перемещения? - person dspyz; 18.12.2013
comment
@dspyz: Дайте мне минуту, чтобы найти ссылку, но это те же условия, которые определяют ее для оптимизации возвращаемого значения. - person Benjamin Lindley; 18.12.2013
comment
@dspyz: проверьте параграфы 31 и 32 12.8: isocpp.org/files/papers/N3797.pdf< /а> - person Benjamin Lindley; 18.12.2013
comment
@dspyz, чтобы расширить, это будет соответствовать требованиям, если вы только что сделали std::unique_ptr<int> p(new int(3)); return p;. - person chris; 18.12.2013