Update dank AlexD Antwort: Diese Frage läuft darauf hinaus, die Sprachregeln für die Mitgliedsfunktion Überlastungen der Auswahl, die in den folgenden Fragen diskutiert: Calling a const function rather than its non-const versionBereich Expression von bereichsbasierten for-Schleifen konstante Funktion verwenden Überlastungen
Wenn der Bereich Expression eines range-based for loop ist ein Aufruf an eine Elementfunktion mit const
und nicht const
Überlastungen, so scheint es, dass die nicht-const
Überlast ausgewählt wird. Als Ergebnis wird das folgende Programm nicht kompilieren:
#include <iostream>
#include <vector>
class foo {
public:
const std::vector<int>& get_numbers() const { return numbers; }
protected:
std::vector<int>& get_numbers() { return numbers; }
private:
std::vector<int> numbers;
};
int main() {
foo f;
for (int x : f.get_numbers()) std::cout << x << std::endl;
}
Diagnosemeldung von gcc 5.3:
error: ‘std::vector<int>& foo::get_numbers()’ is protected
Aber eine const
Version von get_numbers()
ist verfügbar und könnte verwendet werden. Wir können sie zwingen, durch die Verwendung eines const
Verweis auf die foo
Instanz verwendet werden soll, wie folgt aus:
int main() {
foo f;
const foo& g = f;
for (int x : g.get_numbers()) std::cout << x << std::endl;
}
Gibt es eine bessere/einfachere Möglichkeit, den Compiler zu sagen, dass er kann und die const
Memberfunktion Überlastung verwendet werden soll, ohne explizit eine const
Referenz auf das Objekt zu machen?
Es gibt einige similar questions über die bereichsbasierte for-Schleife Gebrauch machen const
Iteratoren, aber ich habe keine Fragen zu machen die Schleife des Bereichsausdruck const
für die Zwecke der Auswahl der Funktion Überlastungen gefunden.
Ich glaube, das als 'foo f erklärt wegen' f' geschieht, 'und nicht' const foo f; 'Deshalb ist die nicht-const überladene Funktion über const gewählt wird. Meine Frage ist, warum brauchen Sie die 'getNumbers()' sowohl öffentliche als auch private? – DimChtz
Vermeiden Sie private/geschützte Getter/Setter (oder verwenden Sie einen anderen Namen) –
@DimChtz Ja, das ist das Problem.Die ausgewählte Überladung ist die Funktionssignatur, nicht der Rückgabetyp. – doug