TL;DW: kompilator Rust nadaje funkcjom różne typy, nawet jeśli ich nagłówek jest identyczny. Dzięki temu generyczny kod wywolujący taką funkcję może ją inline’ować.
Funkcje mogą otrzymać ten sam typ, jeżeli ich kod maszynowy (po optymalizacji) jest taki sam.
C++ rozróżnia funkcje na podstawie samego nagłówka i w związku z tym musi generować bardziej uniwersalne wywołania poprzez wskaźnik (bo wiele funkcji może mieć tę samą listę parametrów i typ zwracany, ale różne implementacje).
Wiem, że w Rust też jest. Uznaje to za przypadek brzegowy w którym ktoś wyszukał problem (którego nie ma).
W Rust też trzeba użyć wiedzy tajemnej. Bo taki wynik nie był jawnie zadeklarowany. Wyszedł taki w tym przykładzie. Nie wiadomo czy taki wyjdzie, kiedy będzie bardziej skomplikowany program. Kompilatory przecież też maja ograniczenia (chyba do 3 warstw abstrakcji).
W C++ masz deklarację, że chcesz taki wynik i dostaniesz błąd, kiedy nie można takiego osiągnąć.