Какой тип имеет int[]

Сразу прошу не предлагать никакие вычурные реализации кода, без использования всяких сторонних библиотек. Мне важно разобраться, а не реализовать как-нибудь. Хочу написать свой небольшой класс умного указателя, чтобы разобраться в этой теме, но столкнулся с такой непонятной вещью: как же определить передаю я массив или передаю один элемент. Решил подсмотреть в теме умные указатели, там вызов происходит следующим образом:

shared_ptr<int[]> p(new int[10]);

как видите они передают в качестве типа int[ ], я попытался сделать тоже самое, но у меня выдает ошибку: error C3863: тип массива "int []" является неназначаемым

Может кто-то знает как заставить работать этот момент?

Мой код:

#include <iostream>
#include "Vector.h"
using namespace std;
template<typename T>
class ptr
{
public:
    ptr(T *p)
    {
        mas = false;
        this->p = p;
    }

    /*======= КОНСТРУКТОР КОТОРЫЙ НАДО РЕАЛИЗОВАТЬ =======*/
    ptr(T p)
    {
        mas = true;
        //this->p = p;
    }

    ~ptr()
    {
        cout << "destruct: " << this->p << ", " << *this->p << endl;
        if (mas)
        {
            delete[] this->p;
        }
        else
        {
            delete this->p;
        }
        cout << "destruct: " << this->p << ", " << *this->p << endl;
        *this->p = 0;
        cout << "destruct: " << this->p << ", " << *this->p << endl;
        this->p = nullptr;
        cout << "destruct: " << this->p << endl;
    }
    T& operator*()
    {
        return *this->p;
    }
private:
    T* p;
    bool mas;
};
int main()
{
    //shared_ptr<int[]> p(new int[10]);
    /*Проблемный момент*/
    ptr<int[]> p = new int[10]{1,2,3,4,5,6,7,8,9};
    //cout << p << endl;
    return 0;
}

Ответы (1 шт):

Автор решения: ampawd

Нужно частично специализировать ваш класс ptr для типов массивов - тогда компилятор сможет определить какой тип был передан, и соответсвенно выберет нужное определение класса:

template<typename T>
class ptr<T[]>
{
public:
    ...

private:
    T* ptr_;
};

Тоесть поэтому и нужен отдельный класс чтобы в нем можно было делать своё отличающееся от типов не-массивов освобождение памяти (delete[] T)

→ Ссылка