Es ist nicht klar, wie die Überladungsauflösung generisch funktionieren würde. Was ist, wenn der Container beispielsweise Prädikate enthält?
struct pred
{
bool operator()(const pred&) const;
friend bool operator==(const pred&,const pred&);
};
std::vector<pred> v;
pred p;
std::find(v.begin(), v.end(), p); // what should happen here?
Diese mögliche Ambiguität wird vermieden, indem Funktionen mit unterschiedlichen Namen verwendet werden, wobei jeder Name die Absicht deutlicher ausdrückt.
Beachten Sie, dass dies eine Vereinfachung ist: Es gibt keine Anforderung in std::find
, dass das Referenzobjekt vom gleichen Typ wie der value_type
des Containers ist, nur dass sie für die Gleichheit vergleichbar sind. Die Anforderungen für das Prädikat in std::find_if
sind ähnlich generisch. Beide Funktionen sind sehr generisch, was dazu führen kann, dass eine Mehrdeutigkeit leichter als im Beispiel gegeben ist. Zum Beispiel
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.
}
"selten"? Ohne einen SFINAE-Trick wären sie durch die Überladungsauflösung nicht zu unterscheiden. –