Чтобы понять, почему это так, рассмотрим этот вызов:
int bar = f(g(h(foo)));
Поскольку разрешение перегрузки включает только аргументы, вы можете вывести h, затем g и, наконец, f независимо. Если возвращаемое значение было задействовано, вам нужно вывести их одновременно. Если каждая имеет 10 перегрузок, в первом случае вы проверяете 30 возможных перегрузок, а во втором - 1000 возможных комбинаций. И если вы думаете, что такой вложенный код встречается редко, рассмотрите
std::cout << "int i = " << i << std::endl;