После попытки определить в стандарте, почему одна перегрузка предпочтительнее другой, я пришел к выводу, что не должно быть, ни одна перегрузка не имеет лучшей последовательности преобразования, чем другая в случае f( int1, float2 )
и кода не должен компилироваться. Если ваш компилятор принимает его, в реализации может быть ошибка.
Что касается второго вопроса, стандарт определяет преобразования, которые можно использовать для сопоставления вызова функции, а также определяет rank для тех преобразований, которые служат в качестве частичного упорядочения (называемого * 1006). * Лучшее преобразование, чем ). Компилятор всегда выбирает преобразование best , и если преобразования best нет, то программа работает неправильно, как в примере.
Проверка неоднозначности кода с различными компиляторами:
НКА:
conv.cpp:22: error: call of overloaded ‘f(int&, float&)’ is ambiguous
conv.cpp:5: note: candidates are: float f(int, int)
conv.cpp:9: note: float f(float, float)
лязг:
conv.cpp:22:13: error: call to 'f' is ambiguous
cout << f(int1, float2) << endl; // output: 2
^
conv.cpp:5:7: note: candidate function
float f (int a, int b) {
^
conv.cpp:9:7: note: candidate function
float f (float a, float b) {
^
MSVS 2010 (спасибо Xeo):
error C2666: 'f' : 2 overloads have similar conversions
src\main.cpp(2): could be 'void f(int,int)'
src\main.cpp(1): or 'void f(float,float)'
while trying to match the argument list '(int, float)'