Por que um ponteiro constante não pode ser uma expressão constante?

O seguinte programa compila:

template <const int * P>
class Test{};

extern const int var = 42; //extern needed to force external linkage

int main()
{
    Test<&var> test;
}

Este, no entanto, não, o que é uma surpresa para mim:

template <const int * P>
class Test{};

extern const int var = 42; //extern needed to force external linkage
extern const int * const ptr = &var; //extern needed to force external linkage
int main()
{
    Test<ptr> test; //FAIL! Expected constant expression.
}

Exemplo alternativo:

int main()
{
   const int size = 42;
   int ok[*&size]; //OK

   const int * const pSize = &size;
   int fail[*pSize]; //FAIL
}

Concluí que um ponteiro simplesmente não pode ser uma expressão constante, independentemente de ser const e inicializado com uma expressão constant

Questões

A minha conclusão é verdadeira? Se sim, por que um ponteiro não pode ser uma expressão constante? Caso contrário, por que os programas acima não são compilados? ++ 0x (C ++ 11, se você quiser) muda alguma cois

Obrigado por todas as idéias!

questionAnswers(3)

yourAnswerToTheQuestion