Re[4]: Ограницения template type arguments
От: Anonim547  
Дата: 02.02.10 19:17
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Единственный вид объявления (не учитывая 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.