Следната програма компилира:
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
}
Заключих, че указателят просто не може да бъде постоянен израз, независимо дали е константен и инициализиран с постоянен израз.
Въпроси:
- Вярно ли е заключението ми?
- Ако е така, защо указателят да не може да бъде константен израз? Ако не, защо горните програми не се компилират?
- C++0x(C++11, ако искате) променя ли нещо?
Благодаря за всякакви прозрения!
ptr
не е постоянен израз (което всъщност е), а за факта, че е променлива. Нямам представа обаче къде е включено това в стандарта. - person Kerrek SB   schedule 12.09.2011