Здравствуйте, NeoCode, Вы писали:
NC>function foo(void, int, void);
NC>(такое может получиться, например, из шаблонной функции при подстановке void в параметры шаблона)
NC>Должен ли компилятор "сворачивать" ее к виду "foo(int)"?
Мой ответ: нет, ни в коем случае. От этого опять куча проблем и граблей.
И еще важный момент: нужно понимать, что f() — это не вызов функции без аргументов, а именно вызов с одним аргументом — (), он же void. Он потому так и называется (), не просто так. Поэтому f(void) не имеет никакого смысла, это же f (()), бессмысленная конструкция даже синтаксически.
А foo(void, int, void) принимает тупл из трех элементов, ни больше ни меньше.