Следующая программа компилирует:
template <const int * P>
class Test{};
extern const int var = 42; //extern needed to force external linkage
int main()
{
Test<&var> test;
}
Этот, однако, не делает, что для меня неожиданно:
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.
}
Альтернативный пример:
int main()
{
const int size = 42;
int ok[*&size]; //OK
const int * const pSize = &size;
int fail[*pSize]; //FAIL
}
Я пришел к выводу, что указатель просто не может быть константным выражением, независимо от того, const или инициализирован константным выражением.
Вопросы:
- Верно ли мое заключение?
- Если да, то почему указатель не может быть постоянным выражением? Если нет, то почему эти программы не компилируются?
- Может ли С++ 0x (С++ 11) изменить что-нибудь?
Спасибо за любые идеи!