Perché i seguenti due modelli non sono compatibili e non possono essere sovraccaricati?Perché un modello con tipo di reso dedotto non è sovraccaricabile con altre versioni di esso?
#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>());
}
penserei sono (più o meno) equivalente con la seguente, che compila bene (come non si può fare decltype auto(t.size())
non posso dare un equivalente esatto senza qualche rumore ..).
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 e GCC lamentano main.cpp:6:16: error: redefinition of 'f'
se lascio fuori il tipo di ritorno finale, tuttavia.
(Si noti che questo è un logica domanda io non sto cercando per il luogo nel standard che definisce questo comportamento -. Che è possibile includere nella vostra risposta anche, se lo si desidera - ma per una spiegazione del perché questo comportamento è desiderabile o status quo).
non è possibile sovraccaricare un funzione sul suo tipo restituito, quindi hanno effettivamente lo stesso prototipo dal punto di vista del compilatore e per questo hai ottenuto l'errore * redefinition *. – skypjack
@skypjack È possibile sovraccaricare i modelli di funzione sul tipo restituito. – jrok
@skypjack Questo è del tutto irrilevante per i modelli di funzione, che è possibile sovraccaricare sul tipo restituito (fa parte della loro firma). – Columbo