Почему это ошибка:
typedef int H[4];
H * h = new H; // error: cannot convert 'int*' to 'int (*)[4]' in initialization
?
Кроме того, почему это не ошибка:
H * h = new H[1];
?
Почему компилятор считает, что new H
возвращает int *
, тогда как new H[1]
возвращает H *
, как ожидалось?
Иначе говоря: , почему T * t = new T;
является правильным для общего типа T, но неверно, когда T
является типом массива?
Каким будет канонический способ выделения простого типа массива, например, через new
?
Обратите внимание, что это упрощенный пример, так, например, new int[4]
не является приемлемым обходным путем - мне нужно использовать фактический тип из предыдущего typedef
.
Заметьте также, что я знаю, что использование std::vector
, std::array
и др. обычно предпочтительнее для массивов в стиле C, но у меня есть "реальный мир", когда мне нужно работать с такими типами, как выше.