2015-05-19 5 views

Antwort

11

Diese Algorithmen bieten eine benannte Version anstelle einer überladenen, da beide Versionen des Algorithmus die gleiche Anzahl von Argumenten haben. Überladen von Unklarheiten wäre daher möglich.

Um mögliche Mehrdeutigkeiten zu vermeiden, bietet die Bibliothek separate benannte Versionen für diese Algorithmen, find_if ist einer dieser.

+3

"selten"? Ohne einen SFINAE-Trick wären sie durch die Überladungsauflösung nicht zu unterscheiden. –

18

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. 
} 
Verwandte Themen