É legal converter um ponteiro para referência de matriz usando static_cast em C ++?

Eu tenho um ponteiroT * pValues que eu gostaria de ver como umT (&values)[N]

Nesta resposta SOhttps://stackoverflow.com/a/2634994/239916, a maneira proposta de fazer isso é

T (&values)[N] = *static_cast<T(*)[N]>(static_cast<void*>(pValues));

A preocupação que tenho com isso é. No exemplo dele,pValues é inicializado da seguinte maneira

T theValues[N];
T * pValues = theValues;

Minha pergunta é se a construção do elenco é legal sepValues vem de qualquer uma das seguintes construções:

1:
T theValues[N + M]; // M > 0
T * pValues = theValues;
2:
T * pValues = new T[N + M]; // M >= 0

questionAnswers(1)

yourAnswerToTheQuestion