Diese Frage lässt sich am einfachsten anhand eines Beispiels veranschaulichen, also hier:
(Nicht alle Implementierungen kompilieren es tatsächlich korrekt, aber ich frage mich, ob das ein Fehler ist.)
%Vor% std::copy
benötigt einen Ausgabe-Iterator ([algorithms.general] / p5); Ausgabe-Iteratoren benötigen unter anderem *r = o
, um gültig zu sein ([output.iterators], Tabelle 108) - nicht nur "gültig manchmal" oder "gültig in einigen Kontexten".
Da für Picky *p, a;
, *p = a
in den meisten Kontexten nicht gültig ist, ist Picky *
kein gültiger Ausgabe-Iterator.
Hmm, es wäre toll, wenn Sie Ihre Antwort auf andere Dinge verallgemeinern könnten über das bestimmte Beispiel hinaus, das ich gab. Wie zum Beispiel,
std::vector::push_back(T const &)
oder was auch immer.
Das Kennenlernen einer Memberfunktion ist ein absolutes No-No, weil Sie nicht einmal garantieren können, dass es eine Memberfunktion mit dieser Signatur gibt ([member.functions] / p2, die Stephan T. Lavavej "STL Implementers kann eine hinterhältige Regel sein ):
Eine Implementierung kann zusätzliche nicht virtuelle Memberfunktionen deklarieren Signaturen innerhalb einer Klasse:
- durch Hinzufügen von Argumenten mit Standardwerten zu einer Memberfunktionssignatur 187 [ Hinweis : Eine Implementierung kann keine Argumente mit Standardwerten zu virtuellen, globalen oder Nichtmitgliedsfunktionen hinzufügen. - Endnote ];
- durch Ersetzen einer Elementfunktionssignatur durch Standardwerte durch zwei oder mehr Elementfunktionssignaturen mit äquivalentem Verhalten; und
- durch Hinzufügen einer Mitgliedsfunktionssignatur für einen Mitgliedsfunktionsnamen.
187 Daher hat die Adresse einer Memberfunktion einer Klasse in der C ++ - Standardbibliothek einen nicht spezifizierten Typ.
Der Code könnte kompilieren, wenn std::copy()
keine anderen Nicht-Freund-Funktionen aufruft, aber ich muss auf eine solche Implementierung stoßen. Und es gibt keine Anforderung in der Standardbegrenzung, wie std::copy()
den erforderlichen Effekt erzielt.
Es erfordert jedoch einen funktionierenden und zugänglichen Zuweisungsoperator.
Tags und Links c++ stl language-lawyer access-modifiers friend