Question

Le projet de travail appelle explicitement que par défaut-fonctions doivent être des fonctions membres spéciales (par exemple, copier-constructeur, constructeur par défaut, etc., (§8.4.2.1-1)). Ce qui est parfaitement logique.

Cependant, je ne vois pas une telle restriction deleted-fonctions (§8.4.3). Est-ce exact?

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

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;
Était-ce utile?

La solution

C ++ 0x Spec (§ [dcl.fct.def.delete]) ne nie pas de telles constructions, et g ++ 4,5 comptabiliser tous les trois d'entre eux.

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

Autres conseils

Je pense qu'ils sont tous OK.

= delete est bon pour assurer une surcharge n'est pas utilisé (§8.4.3 / 2), qui est en dehors des cours d'utiles.

5 mois plus tard, je regarde les autres réponses ... delete est non seulement utile pour les fonctions avec des définitions implicites. Il est l'alternative propre à un commentaire disant « non mise en œuvre - celle-ci constitue une erreur de liaison. » Il fournit un moyen explicite de ne pas mettre en œuvre quelque chose, par exemple un modèle de base où seules spécialisations explicites existeront réellement. Le compilateur se plaindra avant que le temps de lien.

Pour un peu étrange, mais par exemple 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 à abc::do_something().

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

D'après ce que je comprends de la définition de « supprimé » les fonctions membres, est qu'il applique uniquement aux fonctions membres spéciales (constructeur, copie, cession) qui peut être créé automatiquement par le compilateur et non aux fonctions membres ordinaires (ce qui en fait aucun sens de l'OMI, de déclarer des fonctions à être « supprimé », si juste ne les déclarent pas de toute façon)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top