Не существует технической причины для предотвращения перегрузки функций в типах результатов. Это делается в некоторых языках, таких как, например, Ada, но в контексте C ++, который также имеет неявные преобразования (и два вида их), утилита уменьшается, и взаимодействия обеих функций быстро приводят к неоднозначностям.
Обратите внимание, что вы можете использовать тот факт, что неявные преобразования определяются пользователем для имитации перегрузки типа результата:
class CallFProxy;
CallFProxy f(int);
class CallFProxy {
int myParameter;
CallFProxy(int i) : myParameter(i) {}
public:
operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};