Pourquoi ne pas c ++ créer / détruire un élément statique d'un type de modèle.
Observez l'exemple suivant: p>
#include <iostream> struct Dump { Dump() { std::cout << "CTOR" << std::endl; } ~Dump() { std::cout << "DTOR" << std::endl; } }; template <typename T> struct X { static Dump dump; }; template <typename T> Dump X<T>::dump; struct A : X<A> { }; int main() { A a; return 0; }
3 Réponses :
Il n'est pas instancié, sauf si utilisé. Cela fonctionne: également, corrigez l'erreur de compilation: p>
Merci, maintenant ça fait l'affaire. Homme, C'est B> Qu'est-ce que j'appelle un comportement dangereux!
Cela ressemble plus à l'optimisation
Vous n'avez pas besoin d'écrire (void) a.dump code>. Parce que
A A code> entraînera une instanciation du modèle de classe qui créera à son tour l'instance de membre statique.
@Nawaz: L'ensemble du point de la question est que a code> ne i>! Au moins pas implicitement. Ce que j'ai fait maintenant, c'est de mentionner le membre dans
a :: a () code>.
J'ai été mordu par cela une fois, et j'ai appris. Il suffit de le prendre tel quel (j'ai examiné la norme, mais je n'ai pas trouvé les paragraphes pertinents)
Les membres des modèles de classe ne sont instanciés que si elles sont nécessaires; Dans ce cas, rien ne fait référence au député statique, il n'est donc pas instancié, même si le modèle de classe elle-même est. p>
Vous constaterez que mettre la déclaration x ::/mp; code> quelque part entraînera l'instanciation du membre et un objet créé et détruit. P>
J'ai trouvé quelque chose dans 1 / fort> [...] l'instanciation implicite d'une spécialisation de modèle de classe Il continue dans la deuxième note: P>
2 / fort> Sauf si un membre d'un modèle de classe ou d'un modèle de membre a été explicitement instancié ou explicitement spécialisé, la spécialisation du membre est implicitement instanciée lorsque la spécialisation est référencée dans un contexte qui nécessite la la définition des membres exister; en particulier, Par conséquent, sauf si vous l'utilisez, il ne faut pas être instancié em>. Ce n'est pas une optimisation, juste une conformité standard [N3092]. P>
Où instanciez-vous l'un de ces types?
Est-ce que je dois vraiment? Quoi qu'il en soit,
A code> est instancié dans
principal code>, je modifierai.
@Vjo: J'ai essayé de laisser ce qui n'est pas essentiel au problème. Bien sûr, j'ai un
principal code>, voir mon édition (sinon je pourrais construire un exécutable, puis-je?).
EMMM. Quel comportement observent-vous?
Modèle Dump X :: Dump; devrait être un modèle Dump X :: Dump;
@Mat: Merci pour l'indice, je dois l'avoir négligé tout en copiant des choses sur le site. Corrigé maintenant.