По правилу пересечения выбирается второй вариант функции. И происходит это по двум причинам:
Вызов считается неоднозначным, если ни один из вариантов совместно используемых функций не даёт наилучшего сопоставления. Вызов также считается неоднозначным, если несколько вариантов функции дают лучшее сопоставление.
Известно, что значением выражения, состоящего из имени функции, является адрес данной функции. Подобные выражения для перегруженных функций недопустимы в силу своей неоднозначности. Транслятор просто не представляет, адрес какой из функций следует определять. Однако всё же определение адреса совместно используемых функций возможно. Это можно осуществить в контексте определения и инициализации указателя на функцию. Необходимую для выбора соответствующей перегруженной функции информацию транслятор получает из спецификации соответствующего указателя.
char* MyFF1 (int,int,int*,float); char* MyFF1 (int,int*,float); /* Прототипы перегруженных функций. */ ::::: char* MyFF1 (int key1, int key2, int* pVal, float fVal) {/* ... */} char* MyFF1 (int XX, int* pXX, float FF) {/* ... */} /* Определения перегруженных функций. */ ::::: char* (*fPointer1) (int,int,int*,float) = MyFF1; /* Определение и инициализация указателя на первую функцию. Транслятор делает правильный выбор. */ char* (*fPointer2) (int,int*,float); /* Определение указателя на вторую функцию. */ fPointer2 = MyFF1; /* И опять транслятор правильно выбирает соответствующую функцию. */ fPointer1(1,2,NULL,3.14); fPointer2(1,NULL,3.14); /* Вызовы функций по указателю. */