samedi 27 septembre 2014

Encore de la move semantics

J'avais déjà longuement parlé des coûteuses erreurs d'inattention liées à la move semantics lors du passage de paramètres, lorsque des objets qui paraissent parfaitement valides ne le sont plus. Je me suis fait avoir une fois de plus avant-hier. Ce n'est pas aussi terrible que la fois précédente, puisque mon test unitaire a très vite attrapé la faute, mais cela prouve qu'il est finalement assez difficile de ne pas se tromper.

J'ai donc commencé à implémenter l'idée initiale proposée par Yakk sur StackOverflow, et je nomme mes arguments abcMoved pour bien indiquer qu'il faut bien faire attention:

class Person
{
 public:
  A(std::string nameMoved, std::string addressMoved):
    _name(std::move(nameMoved)),
    _address(std::move(addressMoved)
  {
    std::cout << _name << " " << _address << std::endl;
  }

 private:
  std::string _name;
  std::string _address;
};

Avec cette manière de faire, un std::cout << nameMoved << std::endl devrait nous sauter au visage. J'essaie, et je vous en recause.

Aucun commentaire: