2 votes

Valeur r assignable

Pourquoi le code suivant est-il correct :

struct A
{
  A operator+( A const& elem )
  {
    return *this;
  }

  bool operator==( A const& elem )
  {
    return true;
  }

  operator bool()
  {
    return true;
  }
};

int main()
{
  A a_1, a_2;

  if( ((a_1+a_2) = a_1) )
  {}
}

Ici, je m'attendais à une erreur dans l'instruction if puisque a_1 + a_2 est une valeur r. Remplacer la ligne A a_1, a_2; par int a_1, a_2; conduit à l'erreur attendue :

error: expression is not assignable
      if( ((a_1+a_2) = a_1) )
           ~~~~~~~~~ ^
1 error generated.

1voto

songyuanyao Points 2265

Parce que pour la classe A , (a_1+a_2) = a_1 sera simplement interprété comme un appel à A::operator=(const A&) enfin. Même ce qui a_1+a_2 returns est un objet temporaire, l'appel de la fonction membre sur celui-ci est toujours valide.

Si vous voulez interdire de tels appels sur des objets temporaires, vous pourriez utiliser fonctions membres qualifiées de réf. (depuis C++11), qui pourrait être utilisé pour distinguer les objets appelés sont des valeurs l ou des valeurs r, par exemple

struct A
{
  //...
  A& operator=(const A&) && = delete; // prevent from calling with temporary objects
  A& operator=(const A&) & = default;
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X