La prima volta che ho provato a scrivere una gamma basata ciclo for per iterare su unique_ptrs ho scritto:Come scrivere un unique_ptr cui puntatore e dei dati è const
std::vector<std::unique_ptr<Foo>> vec;
// Initialize vec
for (auto v : vec) // error
{}
Mi resi conto allora questo sta cercando di creare una copia di ogni elemento che non ha senso con un unique_ptr. Quindi l'ho scritto come riferimento:
for (auto& v : vec)
{}
Aggiungere un const di fronte a esso non mi impedisce di cambiare il puntatore.
for (const auto& v : vec)
{
v = nullptr; // error (good!)
}
Come posso scriverlo, in modo che i dati indicati non possano essere modificati? Ad esempio, il seguente codice non dovrebbe essere compilato.
for (??? v : vec)
{
v->func();
}
class Foo
{
public:
void func();
private:
bool mBar;
}
Foo::func()
{
mbar = true; // Should cause error
}
Hai sempre bisogno che il pointee sia 'const' (e quindi possa modificare la definizione di' vec') o hai solo bisogno che sia 'const' * per questo ciclo *? –
Un'altra applicazione potrebbe essere la scrittura di una funzione di controllo, quindi preferibilmente solo per il ciclo. Tuttavia, dalle risposte questo non sembra possibile. – user870130
guarda qui: http://stackoverflow.com/questions/15518894/forcing-use-of-cbegin-cend-in-range-based-for – user1095108