int [n] [m], onde n e m são conhecidos em tempo de execução

Muitas vezes, preciso criar uma matriz 2D com largura e altura (que sejam n e m) desconhecidas no momento da compilação, geralmente escrevo:

vector<int> arr(n * m);

E eu acesso elementos manualmente com:

arr[j * m + i] 

Recentemente me disseram que eu poderia escrever:

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

Então, aqui estão duas perguntas:

Esse comportamento é permitido pelo padrão C ++?Como devo passar esse array para uma função? relatórios do g ++ que arr tem tipoint (*)[n], mas novamente, n é dinâmico e não é conhecido fora da função em que é declarado (main)