Разрешение перегрузки выбирает функцию, наиболее близкую к указанному аргументу. Вы предоставили тест. Преобразование не требуется - используется преобразование личности. При этом функция разрешения выбирает f (Тест). Невозможно скопировать тест из предоставленного вами значения rvalue, но разрешение перегрузки уже успешно выполнено ... преобразование в int никогда не проверяется.
g(Eater)
выбрано потому, что типы не совпадают точно, преобразование идентификаторов НЕ используется, и компилятор должен найти работающую процедуру преобразования. g(Slurper)
нет, потому что вы не можете сделать один из предоставленного аргумента.
"Почему этот не выходит из строя: struct A { operator int(); }; void f(A&); void f(int); void g() { f(A()); }
"
Поскольку f (A &) не является допустимой перегрузкой для предоставленного аргумента. В этом случае параметр является ссылкой, и тот факт, что временные переменные не связываются с неконстантными, позволяет влиять на разрешение. В этом случае это происходит, и та версия функции становится не-кандидатом, оставляя только одну, и она работает.