Несколько определений шаблона функции

Предположим, что заголовочный файл определяет шаблон функции. Теперь предположим, что два файла реализации#include это заголовок, и у каждого из них есть вызов шаблона функции. В обоих файлах реализации экземпляр функции создается с одним и тем же типом.

// header.hh
template <typename T>
void f(const T& o)
{
    // ...
}

// impl1.cc
#include "header.hh"

void fimpl1()
{
    f(42);
}

// impl2.cc
#include "header.hh"

void fimpl2()
{
    f(24);
}

Можно ожидать, что компоновщик будет жаловаться на множественные определенияf(), В частности, еслиf()&nbsp;не будет шаблоном, то это действительно так.

Почему компоновщик не жалуется на множественные определенияf()?В стандарте указано, что компоновщик должен корректно обрабатывать эту ситуацию? Другими словами, могу ли я всегда рассчитывать на программы, аналогичные приведенным выше, для компиляции и компоновки?Если компоновщик может быть достаточно умным для устранения неоднозначности набора экземпляров шаблонов функций, почему он не может сделать то же самое для обычных функций, если они идентичны, как в случае экземпляров шаблонов функций?