Quand / pourquoi voudrais-je supprimer explicitement mon constructeur? En supposant que la raison est d'empêcher son utilisation, pourquoi ne pas simplement le faire private?
class Foo
{
public:
Foo() = delete;
};
Quand / pourquoi voudrais-je supprimer explicitement mon constructeur? En supposant que la raison est d'empêcher son utilisation, pourquoi ne pas simplement le faire private?
class Foo
{
public:
Foo() = delete;
};
delete. La question et la réponse de Luchian peuvent être facilement qualifiées de constructives. Quiconque ne respire pas les subtilités de C ++ 11 mais en aura besoin bientôt obtiendra quelque chose des deux.
Réponses:
Que diriez-vous:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
contre
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
Ce sont des choses fondamentalement différentes. privatevous indique que seuls les membres de la classe peuvent appeler cette méthode ou accéder à cette variable (ou à des amis bien sûr). Dans ce cas, il est légal pour une staticméthode de cette classe (ou de tout autre membre) d'appeler un privateconstructeur d'une classe. Cela ne vaut pas pour les constructeurs supprimés.
Échantillon ici .
pourquoi supprimer explicitement le constructeur?
Autre raison:
j'utilise deletequand je veux m'assurer qu'une classe est appelée avec un initialiseur. Je considère cela comme un moyen très élégant d'y parvenir sans contrôle d'exécution.
Le compilateur C ++ effectue cette vérification pour vous.
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
Ce code - très simplifié - garantit qu'il n'y a pas d'instanciation comme celle-ci:Foo foo;
Fooavait de nombreux constructeurs, mais pas un par défaut, Foo foo;cela provoquerait une erreur beaucoup plus longue listant tous les constructeurs implicitement définis, protégés et privés auxquels il ne correspond pas.
J'ai rencontré des ctors par défaut déclarés comme «supprimés» dans le code source de LLVM (dans AlignOf.h par exemple). Les modèles de classe associés sont généralement dans un espace de noms spécial appelé «llvm :: detail». Le but ici, je pense, était qu'ils considéraient cette classe uniquement comme une classe d'aide. Ils n'ont jamais eu l'intention de les instancier; uniquement pour les utiliser dans le contexte d'autres modèles de classe avec quelques astuces de métaprogrammation qui s'exécutent au moment de la compilation.
Par exemple. il y a ce modèle de classe AlignmentCalcImpl qui est utilisé uniquement dans un autre modèle de classe appelé AlignOf en tant que paramètre de l'opérateur sizeof (.). Cette expression peut être évaluée au moment de la compilation; et il n'est pas nécessaire d'instancier le modèle -> alors pourquoi ne pas déclarer le ctor delete par défaut pour exprimer cette intention.
Mais ce n'est que mon hypothèse.
= default, même la classe ne peut pas l'utiliser, et je préfère personnellement voir Utilisation de la fonction supprimée. over La fonction est privée. Le premier stipule explicitement que «ceci n'est pas destiné à être utilisé». Si quelque chose sort de cela, le fait de ne pas pouvoir l'utiliser fait en fait une différence sémantique.