Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Единственный вид объявления (не учитывая 8.3.5/7), порождающее имя, которое имеет 'function type' — это 'function declaration' (декларация объектов-функций запрещена), 'typedef-declaration' создает только синоним для существующего типа.
Если 'function type' не зависит от параметов шаблона, декларация функций не запрещена. Выглядит логичным, что проблема не в декларации функции, как таковой, а в зависимости типа от параметров шаблона.
Отсюда возникает вопрос: какова причина запрета на такой тип, нет ли в 14.3.1/3 неточностей, и не следует ли распространять причины запрета на другие случаи?
Поясню на примере, вопрос возник при анализе следующего:
void helper()
{
}
struct foo
{
void bar() {}
};
template <class T, class F>
void check(F T::*)
{
F* ptr = &helper; // error C2440: 'initializing' : cannot convert from 'void (__cdecl *)(void)' to 'void (*)(void)'
}
int main()
{
check(&foo::bar);
return 0;
}
Компайлер рассматривает calling convention как часть сигнатуры, стандартом это не определено, но как быть? В зависимости от установленной по умолчанию calling convention, VC выдает C2440 или ICE.