343 votes

Signification de = supprimer après la déclaration de la fonction

class my_class
{
    ...
    my_class(my_class const &) = delete;
    ...
};

Qu'est-ce que = delete signifie-t-il dans ce contexte ?

Existe-t-il d'autres " modificateurs " (autres que les = 0 y = delete ) ?

1 votes

Je suis corrigé, j'avais manqué cette fonctionnalité de C++0x. Je pensais que c'était une #define à la Qt qui a évalué à un 0 et a ensuite déclaré une fonction cachée ou quelque chose comme ça.

0 votes

J'ai le souvenir d'un mot clé "disable" qui signifie la même chose ou quelque chose de similaire. Est-ce que je me trompe ? Ou existe-t-il une différence subtile entre les deux ?

276voto

Prasoon Saurav Points 47488

La suppression d'une fonction est une fonctionnalité de C++11 :

L'expression courante "interdire la copie" c directement :

class X {
    // ...
    X& operator=(const X&) = delete;  // Disallow copying
    X(const X&) = delete;
};

[...]

Le mécanisme de "suppression" peut être utilisé pour n'importe quelle fonction. Par exemple, nous pouvons éliminer une conversion non désirée comme ceci :

struct Z {
    // ...

    Z(long long);     // can initialize with an long long         
    Z(long) = delete; // but not anything less
};

7 votes

La méthode traditionnelle pour "interdire la copie" ne consiste-t-elle pas simplement à rendre lecteur de copie et l'opérateur= "privés" ? Cela va un peu plus loin et demande au compilateur de ne même pas générer les fonctions. Si elles sont toutes deux privées et =suppression, la copie est-elle doublement interdite ?

26 votes

@Reb, =delete rend la méthode inaccessible même depuis des contextes qui peuvent voir private (c'est-à-dire au sein de la classe et de ses amis). Cela élimine toute incertitude lorsque vous lisez le code. @Prasoon, ce deuxième exemple ne supprime toujours que les constructeurs - il serait bien de voir une méthode supprimée operator long () par exemple.

7 votes

@Reb.Cabin utilisant = delete est préférable à l'utilisation de private ou d'autres mécanismes similaires, parce qu'habituellement vous veulent la fonction interdite doit être déclarée de manière visible et prise en compte pour la résolution des surcharges, etc., afin qu'elle puisse échouer le plus tôt possible et fournir l'erreur la plus claire à l'utilisateur. Toute solution qui consiste à "cacher" la déclaration réduit cet effet.

115voto

mkaes Points 6867
  1. = 0 signifie qu'une fonction est purement virtuelle et que vous ne pouvez pas instancier un objet de cette classe. Vous devez dériver de cette classe et implémenter cette méthode.
  2. = delete signifie que le compilateur ne générera pas ces constructeurs pour vous. A ma connaissance, cela n'est autorisé que pour les constructeurs de copie et les opérateurs d'affectation. Mais je ne suis pas très bon dans la norme à venir.

8 votes

Il existe d'autres utilisations de la =delete syntaxe. Par exemple, vous pouvez l'utiliser pour interdire explicitement certains types de conversions implicites qui pourraient avoir lieu lors de l'appel. Pour cela, il suffit de supprimer les fonctions surchargées. Pour plus d'informations, consultez la page Wikipedia sur le C++0x.

0 votes

Je le ferai dès que j'en aurai trouvé. Je suppose qu'il est temps de rattraper mon retard en c++0X.

1 votes

Oui, C++0x est génial. J'ai hâte que GCC 4.5+ soit plus courant, pour pouvoir commencer à utiliser les lambdas.

2voto

dubnde Points 2100

Nouvelle norme C++0x. Veuillez vous référer à la section 8.4.3 de la N3242 projet de travail

0voto

Tayyab Points 2337

C'est une nouveauté dans les normes C++ 0x où vous pouvez supprimer une fonction héritée.

17 votes

Vous pouvez supprimer n'importe quelle fonction. Par exemple void foo(int); template <class T> void foo(T) = delete; arrête toutes les conversions implicites. Seuls les arguments de int sont acceptées, toutes les autres tenteront d'instancier une fonction "supprimée".

0voto

Naszta Points 4322

Actuellement une bonne méthode pour cacher le constructeur de copie et la copie operator = :

Dans l'en-tête :

class MyClass
{
private:
  MyClass(const MyClass &); // Not implemented
  MyClass & operator = (const MyClass &); // Not implemented
};

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