La razón por la que no puede hacerlo es que new int[3]
ya asigna exactamente lo que desea, un objeto de tipo int[3]
. Es solo que la nueva expresión devuelve, es un puntero a su primer elemento. 5.3.4/1:
Si la entidad es un objeto no array, la nueva expresión devuelve un puntero al objeto creado. Si es una matriz , la nueva expresión devuelve un puntero al elemento inicial de la matriz .
devolviendo un puntero al primer elemento es lo que permite la 3
para ser desconocida hasta el tiempo de ejecución, por lo que supongo que al saberlo de antemano, que ha tropezaste con la flexibilidad que no se está utilizando.
Supongo que las formas de evitar esto son reinterpretar_cast de nuevo al tipo de puntero que desee (no necesariamente portátil), o asignar una estructura que contenga un int[3]
(y use un puntero a su miembro de datos).
[Editar: er, sí, o la idea de FredOverflow, que no tiene ni desventaja, pero requiere el uso de delete[]
en lugar de delete
.]
supongo que la moral es, si se escribe plantillas que ingenuamente asignar algún tipo desconocido T
con new
, entonces la plantilla no funcionará cuando alguien pase un tipo de matriz como T
. Lo asignará al tipo de puntero incorrecto y, si lo soluciona (quizás con auto
), lo eliminará incorrectamente.
Editar en respuesta a la pregunta de j_kubik:
Ésta es una forma de distinguir entre la matriz y no la matriz tipos. Si se escribe una función como esta, que devuelve un objeto que contiene el puntero y es capaz de eliminarlo correctamente, entonces usted tiene un nuevo genérico/borrar para cualquier tipo T.
#include <iostream>
template <typename T>
void make_thing_helper(T *) {
std::cout << "plain version\n";
}
template <typename T, int N>
void make_thing_helper(T (*)[N]) {
std::cout << "array version\n";
}
template <typename T>
void make_thing() {
make_thing_helper((T*)0);
}
int main() {
typedef int T1;
typedef int T2[3];
make_thing<T1>();
make_thing<T2>();
}
Si he entendido bien, que desea para saber si C++ tiene una forma de "inferir" el tamaño de la matriz sin especificarlo explícitamente en la asignación? –
@oakley: no del todo: me pregunto si uso una sintaxis 'T * p = mew T;' cuando T es un tipo de matriz (con dimensión conocida en tiempo de compilación) –