Mitgliedsfunktion .begin () und std :: begin ()
Aufruf der Mitgliedsfunktion.begin()
vonstd::vector
undstd::begin()
on rvalues führen zu unterschiedlichen Ausgaben, wie der folgende Test zeigt:
vector<int> a{ 1, 2, 3 };
vector<int>::iterator it1 = move(a).begin(); // OK
vector<int>::const_iterator it2 = move(a).begin(); // OK
vector<int>::iterator it3 = begin(move(a)); // Error!
vector<int>::const_iterator it4 = begin(move(a)); // OK
Hier ist mein Verständnis:std::begin()
Anrufeconst&
Überlastung (da es fehlt&&
Überladung), und daher wird ein @ zurückgegebeconst_iterator
Objekt. Der zurückgegebene Wert kann also @ zugewiesen werdeconst_iterator
aber nichtiterator.
std::begin()
keine rWert-Überladung?Nur eine Notiz, die ich benutzt habemove(a)
um das Aufrufen von @ zu demonstrier.begin()
undstd::begin()
on rvalues. Natürlich kann es durch jedes rvalue-Objekt ersetzt werden, für das.begin()
undstd::begin()
sind gut definiert.
Bearbeiten Hier ist das reale Beispiel, das zeigt, wo ich auf dieses Problem gestoßen bin. Ich habe viel vereinfacht, nur um die Idee zu vermitteln, wostd::begin()
wird bei einem r-Wert aufgerufen. Also, seitrow_matrix
ist eine Proxy-Klasse, es sollte kein Problem geben, @ anzurufbegin
undend
bei rWerten, da das zugrunde liegende Objekt identisch ist.
class matrix_row;
class row_iterator;
class matrix {
public:
matrix_row row(int i);
// other members
};
class matrix_row { // <- proxy class representing a row of matrix
public:
row_iterator begin();
row_iterator end();
// other members
private:
int row_;
matrix& matrix_;
};
class row_iterator {
// defined everything needed to qualify as a valid iterator
};
matrix m(3,4);
for(auto x = m.row(1).begin(); x != m.row(1).end(); ++x) {
*x /=2; // OK
}
for(auto x = begin(m.row(1)); x != end(m.row(1)); ++x) {
*x /= 2; // Error
}