Рассмотрим следующий код:
void func(int) {}
template<typename T> void templatedFunc(T) {}
int main()
{
void (*p)(int) = func;
bool test1 = p==func;
//bool test2 = p==templatedFunc<int>; // compilation error
bool test3 = p==&templatedFunc<int>; // but this works
}
Если вы раскомментируете строку test2
и попытаетесь скомпилировать код с g++, вы получите следующую ошибку:
test.cpp: In function ‘int main()’:
test.cpp:8:21: error: assuming cast to type ‘void (*)(int)’ from overloaded function [-fpermissive]
bool test2 = p==templatedFunc<int>; // compilation error
^~~~~~~~~~~~~~~~~~
Получаю этот результат в g ++ 5.3.0 и 6.2.0. В то же время компиляция с помощью clang++ 3.6.0 завершается без предупреждений.
Какой компилятор корректен в соответствии со стандартом здесь - g++, который дает ошибку или clang++, что нет?
И если g++ прав, то почему существует такая асимметрия с нормальными функциями vs templated functions относительно необходимости явного адреса оператора?