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 coisObrigado por todas as idéias!