2017-09-30 1 views
1

Macht es Sinn, dass der std::move_iterator Adapter nur die Iterator-Kategorie des Template-Parameters Iterator-Typ erbt?Iterator Kategorie von Std :: move_iterator

Da vorwärts Iteratoren erfordert, dass die Referenz Art von CV- T& ist jedoch für die Vorwärts-Iterator-Vorlagen, die std::move_iterator<It>::reference wird ein R-Wert anhand des Werttypen des Iterators (mit dem Bezug Qualifier erhalten).

+0

Ja, tut es. Die Iterator-Kategorie beschreibt die Fähigkeiten des Iterators gegenüber einer Bewegung entlang einer Sequenz. Das ändert sich nicht, nur der Referenztyp ändert sich. –

+0

@RichardHodges Aber wenn man eine "geeignete Überladung" für irgendeine Operation bezüglich ihrer Iteratorkategorie auswählt, wird diese "Überladung" einige Annahmen über die gültigen Verwendungen des Iterators machen, was für 'std :: move_iterator's falsch sein wird. –

+0

können Sie ein Beispiel geben? –

Antwort

4

Da vorwärts Iteratoren erfordert, dass der Referenztyp cv-T ist & jedoch

Falsch. Der Standard (C++ 17, N4659, [forward.iterators] /1.3) sagt:

wenn X ein veränderliches Iterator ist, reference ein Verweis auf T ist; wenn X eine Konstante Iterator ist, ist eine Referenz referenceT

Rvalue Referenzen sind eine „Referenz auf T“ bis konst. Daher qualifizieren sie sich. Wenn sie Rvalue-Referenzen ausschließen wollten, hätte der Standard "lvalue reference to T" angegeben.

So ist es perfekt gültig für einen ForwardIterator, eine Rvalue-Referenz zurückzugeben.

Verwandte Themen