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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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