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
) ?
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
) ?
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 };
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 ?
@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.
@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.
= 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.= 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.
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.
Je le ferai dès que j'en aurai trouvé. Je suppose qu'il est temps de rattraper mon retard en c++0X.
Oui, C++0x est génial. J'ai hâte que GCC 4.5+ soit plus courant, pour pouvoir commencer à utiliser les lambdas.
Nouvelle norme C++0x. Veuillez vous référer à la section 8.4.3 de la N3242 projet de travail
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.
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 ?