Почему make_unique не работает с unique_ptr::reset?

Я попытался скомпилировать некоторый код C++ с помощью VS2013, и unique_ptr::reset(), похоже, не работает с make_unique(); небольшой компилируемый фрагмент кода репродукции:

#include <memory>
using namespace std;

int main() {
    unique_ptr<int[]> p = make_unique<int[]>(3);
    p.reset(make_unique<int[]>(10));    
}

Компиляция из командной строки:

C:\Temp\CppTests>cl /EHsc /W4 /nologo test.cpp

Это ошибки компилятора MSVC:

test.cpp(6) : error C2280: 'void std::unique_ptr<int [],std::default_delete<_Ty>
>::reset<std::unique_ptr<_Ty,std::default_delete<_Ty>>>(_Ptr2)' : attempting to
reference a deleted function
        with
        [
            _Ty=int []
,            _Ptr2=std::unique_ptr<int [],std::default_delete<int []>>
        ]
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\memory(16
23) : see declaration of 'std::unique_ptr<int [],std::default_delete<_Ty>>::rese
t'
        with
        [
            _Ty=int []
        ]

Однако следующий код компилируется нормально:

p = make_unique<int[]>(10);

В чем причина такого поведения? Почему unique_ptr::operator=() работает с make_unique(), а unique_ptr::reset() нет?


person Mr.C64    schedule 01.04.2014    source источник


Ответы (2)


reset() принимает указатель.

Кажется, вам нужно простое назначение перемещения:

#include <memory>
using namespace std;

int main() {
    unique_ptr<int[]> p = make_unique<int[]>(3);
    p = make_unique<int[]>(10);    
}

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

person sehe    schedule 01.04.2014

Потому что std::unique_ptr::reset ожидает, что будет управляться указатель на объект, а не другой unique_ptr. make_unique создает unique_ptr.

person juanchopanza    schedule 01.04.2014