int [n] [m], donde n y m son conocidos en tiempo de ejecución

A menudo necesito crear una matriz 2D con ancho y alto (que sean n y m) desconocidos en el momento de la compilación, generalmente escribo:

vector<int> arr(n * m);

Y accedo a elementos manualmente con:

arr[j * m + i] 

Recientemente me dijeron que en su lugar podría escribir:

int arr[n][m] // n and m still only known at runtime.

Así que aquí hay 2 preguntas:

¿Este comportamiento está permitido por el estándar C ++?¿Cómo debo pasar una matriz de este tipo a una función? g ++ informa que arr tiene tipoint (*)[n], pero de nuevo, n es dinámico y no se conoce fuera de la función donde se declara (main)

Respuestas a la pregunta(2)

Su respuesta a la pregunta