B>Наткнулся на непонятное мне поведение компилятора (точнее, линкера, наверное) B>Есть три файла
... B>Почему проект собрался? B>Ведь объявление f() в head.h и определение f() в head.cpp неодинаковы!
Перегружать функции в C++ можно только по аргументам, но не по возвращаемым значениям.
Отсюда следует, что возвращаемое значение не участвует в формировании имени функции на этапе компиляции.
Поэтому никаких проблем с точки зрения линкера нет.