Сообщение Re[7]: Тип 'void' от 10.09.2014 21:49
Изменено 10.09.2014 21:52 Aleх
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, NeoCode, Вы писали:
NC>>
NC>>(такое может получиться, например, из шаблонной функции при подстановке void в параметры шаблона)
NC>>Должен ли компилятор "сворачивать" ее к виду "foo(int)"?
DM>Мой ответ: нет, ни в коем случае. От этого опять куча проблем и граблей.
DM>И еще важный момент: нужно понимать, что f() — это не вызов функции без аргументов, а именно вызов с одним аргументом — (), он же void. Он потому так и называется (), не просто так. Поэтому f(void) не имеет никакого смысла, это же f (()), бессмысленная конструкция даже синтаксически.
DM>А foo(void, int, void) принимает тупл из трех элементов, ни больше ни меньше.
Возникает следующий вопрос.
Считать ли выражения ((a, b), c) и (a, b, c) эквивалентными?
1. Если да, то получается правило такое, что мы можем вставить содержимое вложенных кортежей в текущий. Пусть a имеет тип void, то есть a = (). Тогда получается, что ((a, b), c) эквивалентно ((), b, c), а это эквивалентно (b, c) (в первом преобразовании первый элемент внешнего кортежа преобразовался в два элемента из вложенного кортежа, а во втором преобразовании первый элемент внешнего кортежа преобразовался в ноль элементов). В этой схеме полезным свойством является то, что скобки не принимают непосредственное участие в задании кортежа. Вместо этого кортеж определяется запятыми, а скобки играют роль группировки операторов как в арифметических выражениях.
2. Если считать эти выражения различными, возникает проблема с кортежем единичного размера. Что было бы написано ((a), c), это будет эквивалентно (a, c)? Считаются ((a)), (a) и a эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.
В итоге нужно определиться, какое из решений вызывает меньше проблем и граблей. Я думаю, всё-таки лучше сворачивать пустые кортежи типа void, чем иметь специальные правила для кортежей из одного элемента.
DM>Здравствуйте, NeoCode, Вы писали:
NC>>
function foo(void, int, void);NC>>(такое может получиться, например, из шаблонной функции при подстановке void в параметры шаблона)
NC>>Должен ли компилятор "сворачивать" ее к виду "foo(int)"?
DM>Мой ответ: нет, ни в коем случае. От этого опять куча проблем и граблей.
DM>И еще важный момент: нужно понимать, что f() — это не вызов функции без аргументов, а именно вызов с одним аргументом — (), он же void. Он потому так и называется (), не просто так. Поэтому f(void) не имеет никакого смысла, это же f (()), бессмысленная конструкция даже синтаксически.
DM>А foo(void, int, void) принимает тупл из трех элементов, ни больше ни меньше.
Возникает следующий вопрос.
Считать ли выражения ((a, b), c) и (a, b, c) эквивалентными?
1. Если да, то получается правило такое, что мы можем вставить содержимое вложенных кортежей в текущий. Пусть a имеет тип void, то есть a = (). Тогда получается, что ((a, b), c) эквивалентно ((), b, c), а это эквивалентно (b, c) (в первом преобразовании первый элемент внешнего кортежа преобразовался в два элемента из вложенного кортежа, а во втором преобразовании первый элемент внешнего кортежа преобразовался в ноль элементов). В этой схеме полезным свойством является то, что скобки не принимают непосредственное участие в задании кортежа. Вместо этого кортеж определяется запятыми, а скобки играют роль группировки операторов как в арифметических выражениях.
2. Если считать эти выражения различными, возникает проблема с кортежем единичного размера. Что было бы написано ((a), c), это будет эквивалентно (a, c)? Считаются ((a)), (a) и a эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.
В итоге нужно определиться, какое из решений вызывает меньше проблем и граблей. Я думаю, всё-таки лучше сворачивать пустые кортежи типа void, чем иметь специальные правила для кортежей из одного элемента.
Re[7]: Тип 'void'
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, NeoCode, Вы писали:
NC>>
NC>>(такое может получиться, например, из шаблонной функции при подстановке void в параметры шаблона)
NC>>Должен ли компилятор "сворачивать" ее к виду "foo(int)"?
DM>Мой ответ: нет, ни в коем случае. От этого опять куча проблем и граблей.
DM>И еще важный момент: нужно понимать, что f() — это не вызов функции без аргументов, а именно вызов с одним аргументом — (), он же void. Он потому так и называется (), не просто так. Поэтому f(void) не имеет никакого смысла, это же f (()), бессмысленная конструкция даже синтаксически.
DM>А foo(void, int, void) принимает тупл из трех элементов, ни больше ни меньше.
Возникает следующий вопрос.
Считать ли выражения ((a, b), c) и (a, b, c) эквивалентными?
1. Если да, то получается правило такое, что мы можем вставить содержимое вложенных кортежей в текущий. Пусть a имеет тип void, то есть a = (). Тогда получается, что ((a, b), c) эквивалентно ((), b, c), а это эквивалентно (b, c) (в первом преобразовании первый элемент внешнего кортежа преобразовался в два элемента из вложенного кортежа, а во втором преобразовании первый элемент внешнего кортежа преобразовался в ноль элементов). В этой схеме полезным свойством является то, что скобки не принимают непосредственное участие в задании кортежа. Вместо этого кортеж определяется запятыми, а скобки играют роль группировки операторов как в арифметических выражениях.
2. Если считать эти выражения различными, возникает проблема с кортежем единичного размера. Будет ли ((a), c) эквивалентно (a, c)? Считаются ли ((a)), (a) и a эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.
В итоге нужно определиться, какое из решений вызывает меньше проблем и граблей. Я думаю, всё-таки лучше сворачивать пустые кортежи типа void, чем иметь специальные правила для кортежей из одного элемента.
DM>Здравствуйте, NeoCode, Вы писали:
NC>>
function foo(void, int, void);NC>>(такое может получиться, например, из шаблонной функции при подстановке void в параметры шаблона)
NC>>Должен ли компилятор "сворачивать" ее к виду "foo(int)"?
DM>Мой ответ: нет, ни в коем случае. От этого опять куча проблем и граблей.
DM>И еще важный момент: нужно понимать, что f() — это не вызов функции без аргументов, а именно вызов с одним аргументом — (), он же void. Он потому так и называется (), не просто так. Поэтому f(void) не имеет никакого смысла, это же f (()), бессмысленная конструкция даже синтаксически.
DM>А foo(void, int, void) принимает тупл из трех элементов, ни больше ни меньше.
Возникает следующий вопрос.
Считать ли выражения ((a, b), c) и (a, b, c) эквивалентными?
1. Если да, то получается правило такое, что мы можем вставить содержимое вложенных кортежей в текущий. Пусть a имеет тип void, то есть a = (). Тогда получается, что ((a, b), c) эквивалентно ((), b, c), а это эквивалентно (b, c) (в первом преобразовании первый элемент внешнего кортежа преобразовался в два элемента из вложенного кортежа, а во втором преобразовании первый элемент внешнего кортежа преобразовался в ноль элементов). В этой схеме полезным свойством является то, что скобки не принимают непосредственное участие в задании кортежа. Вместо этого кортеж определяется запятыми, а скобки играют роль группировки операторов как в арифметических выражениях.
2. Если считать эти выражения различными, возникает проблема с кортежем единичного размера. Будет ли ((a), c) эквивалентно (a, c)? Считаются ли ((a)), (a) и a эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.
В итоге нужно определиться, какое из решений вызывает меньше проблем и граблей. Я думаю, всё-таки лучше сворачивать пустые кортежи типа void, чем иметь специальные правила для кортежей из одного элемента.