Eh bien, c':
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
Encore permet techniquement MyClass
à être copiés par les membres et les amis. Bien sûr, ces types et les fonctions sont théoriquement sous votre contrôle, mais la classe est toujours copiable. Au moins avec boost::noncopyable
et = delete
, personne ne peut copier la classe.
Je ne comprends pas pourquoi certaines personnes prétendent qu'il est plus facile de faire une classe non-copiable en C++11.
Ce n'est pas tellement "facile" comme "plus facile à digérer".
Réfléchissez à ceci:
class MyClass
{
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
};
Si vous êtes un programmeur C++ qui a lu un texte d'introduction sur le C++, mais a peu d'exposition à idiomatiques C++ (c'est à dire: beaucoup de programmeurs C++), c'est... déroutant. Il déclare copie des constructeurs et copie des opérateurs d'affectation, mais ils sont vides. Alors pourquoi les déclarer? Oui, ils font private
, mais qui ne soulève plus de questions: pourquoi les rendre privés?
Afin de comprendre pourquoi cela empêche la copie, vous devez vous rendre compte qu'en les déclarant privé, vous faites en sorte que les non-membres/amis ne peut pas le copier. Ce n'est pas immédiatement évident pour les novices. Ni est le message d'erreur qu'ils vont obtenir quand ils essayer de le copier.
Maintenant, le comparer avec le C++11 version:
class MyClass
{
public:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
Que faut-il comprendre que cette classe ne peut pas être copié? Rien de plus que de comprendre ce que l' = delete
de la syntaxe de moyens. Un livre expliquant les règles de syntaxe du C++11 vais vous dire exactement ce que cela fait. L'effet de ce code est évident pour les novices C++ de l'utilisateur.
Ce qui est formidable à propos de ce langage est qu'il devient un idiome parce que c'est la plus claire, la plus évidente façon de dire exactement ce que tu veux dire.
Même boost::noncopyable
nécessite un peu plus de réflexion. Oui, il est appelé "noncopyable", c'est donc l'auto-documentation. Mais si vous ne l'avez jamais vu avant, il soulève des questions. Pourquoi êtes-vous découlant de quelque chose qui ne peut être copié? Pourquoi mes messages d'erreur de parler d' boost::noncopyable
s'constructeur de copie? Etc. Encore une fois, la compréhension de l'idiome nécessite plus d'effort mental.