J'ai un class
que j'utilise à des fins purement syntaxiques, pour appeler une fonction d'une certaine manière. Ceci est un exemple simplifié:Classe non instable en supprimant le destructeur?
#include<iostream>
template<class T1>
struct make{
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
int main(){
double d = make<double>::from(2);
std::cout << d << '\n';
}
Supposons maintenant que je veux avertir l'utilisateur que cette classe ne doit pas être instanciée. Il peut y avoir des utilisations pour que la classe soit instable mais J'ai la curiosité s'il est possible d'interdire cela?
D'abord, j'essayé de supprimer le constructeur par défaut
template<class T1>
struct make{
make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
Mais cela est encore possible:
make<double> m{}; // valid
Enfin, j'ai essayé de supprimer le destructor et qui semblait fonctionner
template<class T1>
struct make{
~make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
Mais il semble que la classe peut encore être allouée par new
.
Dois-je supprimer à la fois le destructor et le constructeur de suppression, (quid du constructeur copie et déplacer?)
Est-ce la meilleure façon de désavouer instanciation? Code ici: http://coliru.stacked-crooked.com/a/0299c377c129fffb
#include<iostream>
template<class T1>
struct make{
make() = delete;
~make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
int main(){
double d = make<double>::from(2);
std::cout << d << '\n';
make<double> m{}; // compile error (no destructor)
auto p = new make<double>{}; // compile error (no constructor)
}
Bonne idée, mais avec votre code c'est toujours autorisé: 'auto p = new make;', il semble qu'il faille encore supprimer le constructeur (ou le rendre privé). –
alfC
@alfC: Je voulais inclure la suppression de la construction.C'est juste une erreur de copier-coller. –
ok, qu'est-ce que vous gagnez en faisant un non-agrégation une fois que le constructeur et les destructeurs sont supprimés ou déclarés privés? – alfC