Okay, nachdem ich auf Kommentar von SplinterOfChaos reagiert habe, I etwas realisiert. Das Problem liegt in Ihrer Verwendung des any_range. Insbesondere das dritte Argument, das angibt, dass das Argument Reference ein const int
ist. Wenn in der Boost-Iterator-Fassade die Referenz keine echte Referenz ist, wird entweder std::input_iterator_tag
verwendet oder es wird kein STL-äquivalentes Tag bereitgestellt.
Es hat damit zu tun, dass streng genommen alle Vorwärts-, bidirektionalen und Random-Access-STL-Iteratoren eine echte Referenz für ihren Referenztyp verwenden müssen. Von 24.2.5 des C ++ 11-Standards:
Eine Klasse oder ein eingebauter Typ X erfüllt die Anforderungen eines Vorwärtsiterators, wenn- X erfüllt die Anforderungen eines Eingabe-Iterators (24.2.3),
- X erfüllt die DefaultConstructible-Anforderungen (17.6.3.1),
- Wenn X ein veränderbarer Iterator ist, ist Referenz eine Referenz auf T; Wenn X ein konstanter Iterator ist, ist Referenz eine Referenz auf const T
- Die Ausdrücke in Tabelle 109 sind gültig und haben die angegebene Semantik und
- Objekte des Typs X bieten die unten beschriebene Mehrfachgarantie.
In diesem Fall gibt es ein std::input_iterator_tag
zurück, wenn nach seinem iterator_category
abgefragt wird, was den Aufruf von std::prev()
veer in Undefiniertes Verhalten verursacht.
Wie auch immer, die Lösung besteht darin, (falls möglich) die Verwendung von boost::any_range
wie folgt zu ändern:
Dies wird dazu führen, dass es eine iterator_category
von std::random_access_iterator_tag
hat, und führt die Operation wie erwartet aus.