Во-первых, если вам нужен уникальный массив, сделайте его
std::unique_ptr<int[]> ptr;
// ^^^^^
Это позволяет интеллектуальному указателю правильно использовать delete[]
для освобождения указателя и определяет operator[]
для имитации обычного массива.
Тогда operator=
определяется только для rvalue ссылок уникальных указателей, а не необработанных указателей, и необработанный указатель не может быть неявно преобразован в интеллектуальный указатель, чтобы избежать случайного назначения, нарушающего уникальность.,Поэтому необработанный указатель не может быть непосредственно назначен ему.Правильный подход - поместить его в конструктор:
std::unique_ptr<int[]> ptr (new int[3]);
// ^^^^^^^^^^^^
или использовать функцию .reset
:
ptr.reset(new int[3]);
// ^^^^^^^ ^
или явно преобразовать необработанный указатель в уникальный указатель:
ptr = std::unique_ptr<int[]>(new int[3]);
// ^^^^^^^^^^^^^^^^^^^^^^^ ^
Если вы можете использовать C ++ 14, предпочтите функцию make_unique
, а не new
:
ptr = std::make_unique<int[]>(3);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^