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.

Ist mein Verständnis korrekt?Warum tutstd::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
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage