2010-05-20 5 views
5

Le brouillon de travail indique explicitement que les fonctions par défaut doivent être des fonctions membres spéciales (par exemple constructeur de copie, constructeur par défaut, etc., (§8.4.2.1-1)). Ce qui est parfaitement logique.Une fonction peut-elle être une fonction supprimée?

Cependant, je ne vois pas une telle restriction sur fonctions supprimées (§8.4.3). Est-ce correct?

Ou en d'autres termes sont ces trois exemples valides c++0?

struct Foo 
{ 
    // 1 
    int bar(int) = delete; 
}; 


// 2 
int baz(int) = delete; 


template< typename T > 
int boo(T t); 

// 3 
template<> 
int boo<int>(int t) = delete; 
+1

Qu'est-ce qu'une fonction supprimée? – Puppy

+1

Une fonction supprimée est une fonction qui aurait existé si elle n'avait pas été supprimée. Par exemple. vous pouvez supprimer la copie de classe ctor. Ceci est légèrement supérieur à la rendre privée non mise en œuvre, pour deux raisons. 1. il est plus évident en lisant le code et 2. vous pouvez obtenir un message d'erreur plus clair. – MSalters

+2

@MSalters: Vous pouvez également supprimer des fonctions qui n'existent pas, empêchant leur utilisation. Par exemple. donné 'void f (double); void f (int) = delete; ', f (42) est maintenant une erreur plutôt que d'utiliser une conversion implicite. –

Répondre

4

La spécification C++ 0x (§ [dcl.fct.def.delete]) ne nie pas ces constructions, et g ++ 4.5 reconnaît les 3 d'entre elles.

x.cpp: In function 'int main()': 
x.cpp:4:8: error: deleted function 'int Foo::bar(int)' 
x.cpp:21:11: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:2: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:8: error: used here 
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]' 
x.cpp:23:7: error: used here 
-3

D'après ce que je comprends de la définition des fonctions membres « supprimé », est qu'il applique uniquement aux fonctions membres spéciales (constructeur, copie, cession) qui peuvent être créées automatiquement par le compilateur et non à un membre ordinaire fonctions (ce qui n'a aucun sens du tout IMO, pour déclarer les fonctions à "supprimer", donc ne les déclarez pas de toute façon)

+1

Il peut être utilisé pour n'importe quelle fonction qui a une valeur par défaut. Par exemple, pour désactiver la promotion. – a1ex07

4

Je pense que tout va bien.

= delete est bon pour s'assurer qu'une surcharge n'est pas utilisée (§8.4.3/2), ce qui est utile en dehors des classes.

Maintenant, 5 mois plus tard, je regarde les autres réponses ... delete n'est pas seulement utile pour les fonctions avec des définitions implicites. C'est l'alternative propre à un commentaire disant "pas d'implémentation - l'utilisation de ceci est une erreur de lien". Il fournit une manière explicite de ne pas implémenter quelque chose, par exemple un modèle de base où seules les spécialisations explicites existeront réellement. Le compilateur va se plaindre avant l'heure de la liaison.

Pour un exemple un peu étrange, mais tout à fait raisonnable, compte

class abc { 
protected: 
    inline virtual ~abc() = 0; 
    inline virtual void do_something() = 0; 
}; 

abc::~abc() {} 
void abc::do_something = delete; 

Les deux = 0 et = delete peuvent être utilisés sur la même fonction. Sans = delete, l'utilisateur peut donner un appel de courtoisie accidentelle au abc::do_something().

Je ne serais pas surpris si la prochaine itération de C++ après C++ 0x ajoute des classes explicitement supprimées.

Questions connexes