Warum wurde-pair-Bereich Zugriff entfernt von C++11?
Ich habe gerade entdeckt, dass an einer Stelle, die C++11-Entwurf hatte std::begin
/std::end
überladungen für std::pair
erlaubt, dass die Behandlung von einem paar von Iteratoren als Bereich geeignet für den Einsatz in einem range-basierte for-Schleife (N3126, Abschnitt 20.3.5.5), aber das hat sich inzwischen entfernt.
Weiß jemand, warum es entfernt wurde?
Finde ich die Entfernung sehr schade, denn es scheint, dass es keinen anderen Weg, um zu behandeln, ein paar von Iteratoren, die als eine Reihe. In der Tat:
- Die lookup-Regeln für das beginnen/enden in einem range-basierte for-Schleife sagen, dass begin/end-gesucht-in-1) als member-Funktionen der "range" - Objekt 2) als freie Funktionen in den "zugehörigen namespaces"
std::pair
keine begin/end-member-Funktionen- Die nur im Zusammenhang namespace für
std::pair<T, U>
im Allgemeinen namespace std - Wir dürfen nicht zu überlasten
std::begin
/std::end
fürstd::pair
uns - Können wir spezialisieren
std::begin
/std::end
fürstd::pair
(weil die Spezialisierung hätte teilweise und das ist nicht zulässig, Funktionen)
Gibt es eine andere Möglichkeit, die ich bin fehlt?
- Nicht begin(), end() für ein std::pair die gleiche Sache wie .ersten und .zweite?
- Ja, aber, es zu benutzen in eine range-basierte for-Schleife, die wir brauchen, begin() und end().
- Wahrscheinlich, weil der Semantik (ein paar nicht necessarilty Bereich) und Unklarheiten zu vermeiden, wie z.B. hier berichtet: stackoverflow.com/questions/4155450/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass die 2009 Papier "Paare machen sich nicht gut-Bereiche" von Alisdair Meredith ist zumindest ein Teil der Antwort. Im Grunde, viele algorithmen zurück Paare von Iteratoren, die sind tatsächlich nicht garantiert werden gültig, reicht. Es scheint, Sie entfernt die Unterstützung für
pair<iterator,iterator>
aus dem-Bereich Schleife aus diesem Grund. Allerdings ist die vorgeschlagene Lösung nicht vollständig angenommen.Wenn Sie wissen, für bestimmte, dass ein paar von Iteratoren wirklich bedeutet, ein zulässiger Bereich dann könnten Sie wickeln Sie Sie in einem benutzerdefinierten Typ, bietet begin()/end() member-Funktionen:
(ungetestet)
Ich Stimme das ist ein bisschen wie eine Warze. Funktionen, die Rückkehr gültigen Bereiche (wie equal_range) sagen sollte also mit einer entsprechenden Rückgabetyp. Es ist ein bisschen peinlich, dass wir manuell zu bestätigen, diese über so etwas wie
as_range
oben.boost::make_iterator_range
macht das selbe wie die Sache für Sie. Ich verstehe, dass dieser code ist für die Ausstellung nur.Können Sie
boost::make_iterator_range
.Es erstellt eine iterator_range mit
begin()
undend()
Methoden.boost::make_iterator_range
akzeptieren kannstd::pair
von Iteratoren.aufbauend auf die obige Antwort, die mit c++11 Optimierungen:
_t
. Siehe: Was sind die Regeln über die Verwendung eines Unterstriches in einem C++ - Bezeichner?.int my_int_t;
- und dies ist Recht:struct my_tag_t {};
_t
finden Sie unter GNU - Reservierte Namen. Also POSIX hält sich frei, jetzt oder zu irgendeinem Zeitpunkt in der Zukunft, deklarieren Sie eine neue Art mit diesem suffix im globalen namespace. POSIX ist kein C++, also eine neue Art nicht geschachteltstd
es wird global sein. Wenn dieser Typ Konflikt mit einer Art in eine bestehende Codebasis, dann, dass die codebase ist als (und schon immer) in der falschen nicht spielen nach den Regeln.struct range
, undmake_range
für die Kostenlose Funktionen. Aber das ist ein Fall von irrenden auf der Seite des seins besonders vorsichtig sein.lower_case_names
in c und c++ aber ich finde Sie einfacher und natürlicher zu Lesen alscamelCaps
. Ich habe auch oft Namen funktoren wie diese:struct do_something_f;
zu behaupten, dass es ein function-Objekt.pair_t
ist unter einer rvalue-Referenz und damit bindet nur an rvalues. Es ist keine universal - /forwarding-Referenz, weil das argument es nicht herausgeführt. Diestd::forward
Aufruf übergeben wird, eine nicht-Referenz-Typ, so bedingungslos bewegt. Das ist ok, aber möchten Sie wahrscheinlich zu akzeptieren lvalues, zu.