l'operator == doit être implementé ?
Bonsoir
J'aimerai savoir pourquoi l'operateur == n'est pas déduit automatiquement par le compilateur (comme par exemple l'operateur d'affectation, le constructeur par recopie), même dans un cas trivial ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Foo
{
std::string m_str;
int m_value;
public:
Foo(const std::string& str, int value)
: m_str(str)
, m_value(value)
{
}
bool operator == (const Foo& other) {
return m_str == other.m_str && m_value == other.m_value;
}
const std::string& GetString() const { return m_str; }
int GetValue() const { return m_value; }
}; |
Si je n'implemente pas l'operator==, je ne peux pas supprimer un element d'une liste de Foo :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| int main(int argc, char **argv)
{
typedef std::list<Foo> ListFoo;
ListFoo listFoo;
listFoo.push_back( Foo("1", 0) );
listFoo.push_back( Foo("2", 0) );
listFoo.push_back( Foo("3", 0) );
listFoo.push_back( Foo("3", 1) );
listFoo.remove( Foo("3", 0) );
return 0;
} |
Avec l'operator == implementé, pas de problèmes. Sans, j'ai :
Code:
error: no match for 'operator==' in '__first.std::_List_iterator<_Tp>::operator* [with _Tp = Foo]() == __value'
Ce qui me parait surprenant, c'est qu'il faille implémenter cet opérateur dans le cas trivial de variables membres ayant toutes l'operator== de défini.
Avez vous une explication, ou bien c'est juste pour forcer le developpeur à expliciter cet operateur (dans ce cas, pourquoi ne pas faire la même chose pour l'operateur= et le constructeur par recopie ?).
--
Jérémie