Здравствуйте, remark, Вы писали:
R>Сейчас вы увидите, как на стандартном с++ можно иметь переменные значения в компайл-тайм!
R>R>char engine(...);
R>template<typename, int> struct magic;
R>typedef magic<char, -1> magicc;
R>template<typename type = int, int id = sizeof(engine(*(magicc*)0, *(type*)0))>
R>struct magic
R>{
R> friend int engine(magicc&, type&);
R> static const int val = id;
R>};
R>int main()
R>{
R> char a[magic<>::val != magic<>::val ? 1 : -1];
R>}
R>
Хм... Оригинально, но не понятно, должно ли это работать так, как задумано. Как известно, friend declaration не вводит в охватывающий namespace видимого имени. Поэтому не ясно, почему в твоем случае при второй инстанциации 'magic' lookup для дефолтного аргумента вдруг должно найти именно "друга", а не явно объявленную оригинальную версию 'engine'...
На Comeau Online — не работает. А именно, оба 'magic<>::val' одинаковы.