¿Por qué una plantilla con el tipo de retorno deducido no se puede cargar con otras versiones?

¿Por qué las siguientes dos plantillas son incompatibles y no se pueden sobrecargar?

#include <vector>

template<typename T>
auto f(T t) { return t.size(); }
template<typename T>
auto f(T t) { return t.foobar(); }

int main() {
   f(std::vector<int>());   
}

Creo que son (más o menos) equivalentes con lo siguiente que se compila bien (como no podemos hacerdecltype auto(t.size()) No puedo dar un equivalente exacto sin algo de ruido ...).

template<typename T>
auto f(T t) -> decltype(t.size() /* plus some decay */) { return t.size(); }

template<typename T>
auto f(T t) -> decltype(t.foobar() /* plus some decay */) { return t.foobar(); }

Clang y GCC se quejanmain.cpp:6:16: error: redefinition of 'f' si dejo el tipo de retorno final, sin embargo.

(Tenga en cuenta que este es unRazón fundamental o base lógica pregunta. No busco el lugar en el Estándar que define este comportamiento, que también puede incluir en su respuesta, si lo desea, sino una explicación de por qué este comportamiento es deseable o status-quo).

Respuestas a la pregunta(4)

Su respuesta a la pregunta