Considérons le programme simple ci-dessous, qui tente d'itérer à travers les valeurs d'un ensemble en utilisant des références NON-const aux éléments de celui-ci :
#include <set>
#include <iostream>
class Int
{
public:
Int(int value) : value_(value) {}
int value() const { return value_; }
bool operator<(const Int& other) const { return value_ < other.value(); }
private:
int value_;
};
int
main(int argc, char** argv) {
std::set<Int> ints;
ints.insert(10);
for (Int& i : ints) {
std::cout << i.value() << std::endl;
}
return 0;
}
En compilant ceci, j'obtiens une erreur de gcc :
test.c: In function ‘int main(int, char**)’:
test.c:18:18: error: invalid initialization of reference of type ‘Int&’ from expression of type ‘const Int’
for (Int& i : ints) {
^
Oui, je sais que je n'essaie pas réellement de modifier les éléments dans la boucle for. Mais le fait est que je devrais être en mesure d'obtenir une référence non constante à utiliser dans la boucle, puisque l'ensemble lui-même n'est pas qualifié de constant. J'obtiens la même erreur si je crée une fonction setter et que je l'utilise dans la boucle.