Войти
ФлеймФорумПрограммирование

[C++11,сказка] Символы для обжатия параметров шаблонов выбраны ошибочно?

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 Следующая »
#0
15:10, 2 фев. 2014
Привет!

Сообщество, посмотри, а не ошибочно ли выбраны символы для обжатия шаблонных параметров.
<сказка>

Итак, жили-были две функции:

void func0(bool=false); //ok
void func1(bool=8>=8);  //ok

И на лексемы разбирались они успешно и без конфликтов.

И был у них друг помошник:

#define F(TYPE,NAME,VALUE)TYPE NAME=VALUE;
F(int,value,0);
#undef F

Лексер и его на лексемы разбирал.

Но пришли злые шаблоногородители и по нагородили шаблонов...

Нагородили шаблонные структуры типа таких:

template<bool>struct a{constexpr a(bool){}};

и переменные типа таких:

a<0> var=0;
map<int,int> m;

А лексер всё стоял и терпел. Он всё успешно на лексемы разбирал.

Но радилась как-то в коде функция типа такой:

void func2(a<0>=8>=8); // fail

И не выдержал лексер:

prog.cpp:4:18: warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Wparentheses]
 void func2(a<0>=8>=8); // fail
                  ^
prog.cpp:4:12: error: parse error in template argument list
 void func2(a<0>=8>=8); // fail
            ^ 

Не понял он что хотят от него.

void func2(a<0> = 8>=8 ); // это?
void func2(a< 0>=8 > =8); // или это?

... да как же вам объяснить?
А давайте я заменю "<" на "{", а ">" на "}".

И не понял лексер, что хотят от него.

void func2(a{0}=8>=8); // это?
void func2(a{0>=8}=8); // или это?

А потом уродилось в коде ещё и это:

#define F(TYPE,NAME,VALUE)TYPE NAME=VALUE;
F(a<0>,var,0); //ok
#undef F

Но лексер терпел.

Терпел, да не выдержал.

#define F(TYPE,NAME)TYPE NAME;
F(map<int,int>,m); //fail
#undef F

Решил он забить на дело гиблое:

prog.cpp:7:17: error: macro "F" passed 3 arguments, but takes just 2
 F(map<int,int>,m); //fail
                 ^
И ужёл он к другим стандартописателям.
</сказка>

tags: черновик, сказка, С++11, шаблоны, макросы, лексер


+ Код


#1
15:30, 2 фев. 2014

Adler
Да, труп страуса сделал неудачный выбор скобок для параметров шаблона

#2
15:51, 2 фев. 2014

Закопайте уже труп стюардессы страуса.Adler

> void func2(a<0>=8>=8);
Так верстают только чудаки.

#3
16:05, 2 фев. 2014

Adler

>void func2(a<0>=8>=8); // fail
Прежде чем давать дефолтное значение аргументу, дай ему имя.
Это все-равно что писать: int = 2+2

>F(map<int,int>,m); //fail
Возьми ( и ) - расставлять по вкусу.

Пишите грамотно:
http://ideone.com/RKYA85

#4
16:14, 2 фев. 2014

"понапишу-ка я фигни и буду утверждать, что это проблема компилятора и языка"-тред.

#5
16:24, 2 фев. 2014

Adler
> void func1(bool=8>=8); //ok

Вон из профессии.

#6
16:42, 2 фев. 2014

Adler
> void func2(a<0>=8>=8); // fail
а если написать по нормальному
void func2(a<0> var=8>=8); // ok

#7
18:20, 2 фев. 2014

=A=L=X=
> Adler
> > void func1(bool=8>=8); //ok
> Вон из профессии.

А что не так?

Declaring functions - cppreference.com:

4) Declares an unnamed parameter with a default value
int f(int = 7, int * = nullptr, int (*(*)(double))[3] = nullptr);
#8
18:29, 2 фев. 2014

eMan.Lived
> А что не так?

Уважайте коллег. Пишите разборчиво.

#9
18:41, 2 фев. 2014

Kartonagnick
> Уважайте коллег. Пишите разборчиво.
В свою очередь уважайте тех, для кого программирование не профессиональная деятельность, но хобби.

#10
18:46, 2 фев. 2014

eMan.Lived
> В свою очередь уважайте тех, для кого программирование не профессиональная
> деятельность, но хобби.

Я уважаю, поэтому стараюсь писать максимально разборчиво. Что бы даже дилетанты смогли понять.

#11
19:08, 2 фев. 2014

Так ведь у ТС всё тоже разборчиво — код подаётся небольшими порциями, перемежающимися собственными рассуждениями. Если же у кого-то возникла проблема с «распарсиванием» кода, то это скорее всего признак квалификации «распарсивающего», а не автора темы.


Kartonagnick
> Я уважаю, поэтому стараюсь писать максимально разборчиво.
Хочешь сказать, что Adler не старался, или, старался, но недостаточно? :-)

#12
19:28, 2 фев. 2014

eMan.Lived
> Так ведь у ТС всё тоже разборчиво — код подаётся небольшими порциями,
> перемежающимися собственными рассуждениями. Если же у кого-то возникла проблема
> с «распарсиванием» кода, то это скорее всего признак квалификации
> «распарсивающего», а не автора темы.

Объясните это своему компилятору и его разработчикам.

eMan.Lived
> Хочешь сказать, что Adler не старался, или, старался, но недостаточно? :-)

Хочу сказать, что контекстно-зависимые правила языка достаточно сложны.
Поэтому, нет ничего удивительного в том, что какую то редкую конструкцию компилятор не смог распарсить.

Однако факт - компиляторы тестируют на рабоспосбность, отрабатывая все стандартные юзкейсы.

Поэтому, спотыкаются компили только на нестандартных, черезвычайно редких конструкциях языка.

Вывод: подобного рода "нежданчики" сегодня таятся далеко за пределами нормального использования. И проявляются только у извращенцев, которые пишут код через жеппу.

Лично меня мало волнуют трудности компилятора. Меня волнуют трудности людей. Которым это придется читать и поддерживать.

Поэтому, я поддерживаю. За такое:

=A=L=X=
> > void func1(bool=8>=8); //ok
> Вон из профессии.

Вон из профессии.

#13
20:03, 2 фев. 2014

eMan.Lived
> А что не так?
8>=8
Клинических идиотов тест запущен.

#14
20:08, 2 фев. 2014

Kartonagnick
> Вывод: подобного рода "нежданчики" сегодня таятся далеко за пределами нормального использования. И проявляются только у извращенцев, которые пишут код через жеппу.
Не всем же быть частью безликой серой массы программистов профессионалов.

> Лично меня мало волнуют трудности компилятора. Меня волнуют трудности людей. Которым это придется читать и поддерживать.
Может уже нужно прекратить думать, что во флейме постят код, исключительно из крупных профессиональных проектов крупных профессиональных компаний с крупными профессиональными программистами, и хоть раз поглядеть не через призму профессионально деформированной личности? ;-)

Страницы: 1 2 3 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.