Non è chiaro come la risoluzione del sovraccarico funzioni genericamente. Cosa succede se, ad esempio, il contenitore contiene predicati?
Questa potenziale ambiguità viene evitata avendo funzioni con nomi diversi, ogni nome esprime più chiaramente l'intento.
Si noti che questa è una semplificazione: non è richiesto in std::find
che l'oggetto di riferimento sia dello stesso tipo di quello value_type
del contenitore, solo che siano confrontabili per l'uguaglianza. I requisiti per il predicato in std::find_if
sono genericamente simili. Entrambe queste funzioni sono estremamente generiche, il che significa che un'ambiguità potrebbe presentarsi più facilmente rispetto all'esempio fornito. Ad esempio,
struct foo {};
struct pred
{
bool operator()(const foo&) const;
};
bool operator==(const foo&, const pred&);
int main()
{
std::vector<foo> v;
pred p;
std::find(v.begin(), v.end(), p); // What should this do?
std::find_if(v.begin(), v.end(), p); // Here, it is clear.
}
"raro"? Senza un trucco di SFINAE, sarebbero sempre indistinguibili dalla risoluzione del sovraccarico. –