7

Je voudrais retourner un objet non-occlusable de type Foo à partir d'une fonction. Il s'agit essentiellement d'un objet auxiliaire que l'appelant utilisera pour effectuer un ensemble d'actions, avec un destructeur pour effectuer un nettoyage après la fin des actions.Est-il mauvais de ne fournir qu'un constructeur de mouvement?

Avant l'avènement de rvalue references, j'aurais retourné un shared_ptr<Foo> ou quelque chose de similaire. Avec les références rvalue, une autre option consisterait à rendre le constructeur et le constructeur de copie privés, et à faire en sorte que le seul constructeur public soit un constructeur de déplacement. Foo ressemblerait à quelque chose comme ceci:

class Foo : boost::noncopyable 
{ 
private: 
    Foo(/* whatever the real ctor needs */); 

public: 
    Foo(Foo && src); 

    // ... interesting stuff ... 
}; 

Foo a(SomethingThatReturnsFoo()); // allowed 
Foo b;  // error, no public default constructor 
Foo c(a); // error, noncopyable 
Foo d = a; // error, noncopyable 

Ma question est de savoir si ce serait une mauvaise forme pour ce faire, ou si elle semble raisonnable. Je ne vois aucune raison pour laquelle cela causerait des problèmes ou serait difficile à lire, mais je suis encore un peu novice en ce qui concerne les références, donc il pourrait y avoir des considérations auxquelles je ne pense pas.

+0

Remarque mineure: si vous fournissez un 'Constructeur de déplacement ', les utilisateurs s'attendront probablement également à un' Opérateur d'affectation de mouvement '. Avez-vous l'intention de le fournir, ou voulez-vous une classe immuable? –

+0

Dans ce cas particulier, il est destiné à être immuable, donc je ne veux pas affectation, mais c'est un bon point en général. – Charlie

+0

btw, avec les changements récents dans le département des opérations de copie/déplacement générées par le compilateur, vous n'avez plus besoin de dériver de boost :: noncopyable plus. La déclaration d'un constructeur de déplacement empêchera déjà le compilateur de générer d'autres opérations de copie/déplacement, voir http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze

Répondre

9

Ce n'est pas une mauvaise forme du tout - considérez des objets comme des mutex ou des objets de portée comme unique_ptr. Unique_ptr est mobile mais pas copiable et fait partie de la STL.

+0

J'ajouterais même que c'est * très bonne forme *. Je pense sincèrement que les objets copiables doivent être l'exception *, pas la règle. Plus j'utilise C++ 0x, plus je suis confiant dans cette réflexion. –

Questions connexes