Das erste Mal habe ich versucht, einen Bereich für Schleife basierend zu schreiben über unique_ptrs iterieren schrieb ich:Wie ein unique_ptr, dessen Zeiger und Daten zu schreiben, ist const
std::vector<std::unique_ptr<Foo>> vec;
// Initialize vec
for (auto v : vec) // error
{}
Ich erkannte dann diese eine Kopie zu erstellen versucht, jedes Elements, das mit einem unique_ptr keinen Sinn ergibt. Also schrieb ich es als eine Referenz:
for (auto& v : vec)
{}
Das Hinzufügen einer Const davor hält mich davon ab, den Zeiger zu ändern.
for (const auto& v : vec)
{
v = nullptr; // error (good!)
}
Wie kann ich es schreiben, so dass die angezeigten Daten nicht geändert werden können? Zum Beispiel sollte der folgende Code nicht kompiliert werden.
for (??? v : vec)
{
v->func();
}
class Foo
{
public:
void func();
private:
bool mBar;
}
Foo::func()
{
mbar = true; // Should cause error
}
Müssen Sie immer den Pointee "const" (und damit die Definition von 'vec' ändern) oder brauchen Sie nur für diese Schleife * const' *? –
Eine andere Anwendung könnte das Schreiben einer Inspektorfunktion sein, also vorzugsweise nur für die Schleife. Aus den Antworten klingt dies jedoch nicht möglich. – user870130
siehe hier: http://stackoverflow.com/questions/15518894/forcing-use-of-cbegin-cend-in-range-based-for – user1095108