Muss die C ++ - Standardbibliothek Klassen unterstützen, die wählerisch sind, wer ihre Freunde sind?

8

Diese Frage lässt sich am einfachsten anhand eines Beispiels veranschaulichen, also hier:

Ist der folgende Code garantiert gültig und compile & amp; richtig laufen?

(Nicht alle Implementierungen kompilieren es tatsächlich korrekt, aber ich frage mich, ob das ein Fehler ist.)

%Vor%     
Mehrdad 07.05.2015, 20:45
quelle

2 Antworten

8

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.

    
T.C. 07.05.2015, 21:01
quelle
1

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.

    
Peter 07.05.2015 21:15
quelle