Considérant et une fonction de modèle p> regarder La question: est-il possible en C ++ à la construction par défaut une variable générique, autre qu'avec template-fu? p> p> t1 code>, il ne sera pas initialisé quand
t code> est par exemple
int code>. D'autre part,
t2 code> sera Copie-construit à partir de em> un temporaire construit par défaut. P>
4 Réponses :
Voici une astuce que vous pouvez utiliser, en utilisant une classe locale:
T obj{}; // obj is value-initialized
Je pense que vous auriez pu le lire de ma réponse à ladite question :) Stackoverflow.com/Questtions/5300602/...
@xtofl: Ah, donc vous savez déjà de ce truc. À ma connaissance, c'est le moyen C ++ 03 de le faire (en C ++ 0x, vous pouvez utiliser une liste d'initialistes). [Je n'avais pas vu cette question ce matin; Cette astuce a été mentionnée parfois l'année dernière]
J'attendais que quelqu'un mentionne C ++ 0x. Pourriez-vous donner un exemple pour ça?
@xtofl: J'ai ajouté comment cela peut être fait avec une liste d'initialiseurs Vide C ++ 0x.
@xtofl: En C ++ 0x, cela devrait être simplement x x {}; code> - Cependant, il semble que, à ce moment-là, certains compilateurs peuvent (apparemment par erreur ?!) Invoquer une surcharge de constructeur prise
initialiszer_list code> si disponible (voir iDoneone.com/il93e et commentant la surcharge à comparer).
Merci. Cela répond un peu à ma question: Non, il n'y a aucun moyen de C ++ <0x, mais C ++ 0x prévoit dans la liste d'initialiseurs "vide".
C ++ <0x ressemble à un mec à quatre bras à quatre armes sur une planche à roulettes ou quelque chose. ;-)
@Unclebens, oui à tort. Voir Open-Std.org/jtc1/sc22/wg21 /docs/cwg_defects.html#990
Quelle est votre vraie question? Le constructeur par défaut est appelé pour t1 em> instance. P>
Oui, si t code> est un type de classe. Si
t code> est, E.G.,
int code>, alors
t1 code> sera laissé ininitialisé.
Eh bien ... ce n'est pas pour int code>. Je vais essayer de reformuler la question.
@James: Mais quel est le point de l'exercice? Est-ce une question de trivialité? Essaie-t-il d'initialiser automatiquement des variables?
Il essaie d'écrire un code générique qui fonctionne pour les classes ainsi que pour les types intégrés et n'entraîne aucune surcharge.
t t2 = t (); // appellera le constructeur par défaut, puis copier constructeur ...: ( p>
pas sur mon compilateur (VC2008). La sortie pour moi est ... p>
C::C() C::C()
C'est parce que l'appel au constructeur de copie peut être élu. Si le constructeur de copie était inaccessible ou autrement incassible, le t t2 = t (); code> ne fonctionnera pas.
Juste, je l'obtiens maintenant. Peut-être que le commentaire dans la question doit être lu "// nécessite un constructeur de copie accessible :("
Si vous ne vous souciez pas du fait que le constructeur de copie doit exister et que je souhaite simplement l'empêcher d'être appelé: p>
Ne vous inquiétez pas: ce ne sera pas. L'appel du constructeur de copie sera strong> être éluisé dans cette situation. Toujours, et fiable - même lorsque vous compilez avec des optimisations désactivées em> ( -O0 code>). P>
"Toujours, et fiable" - sur chaque compilateur C ++ jamais effectué, et même lorsque le constructeur de copie est inaccessible?
@Ben à la première partie: à tout ce qui importe. À la deuxième partie: j'ai abordé cela dans la première phrase de ma réponse.
"toujours et fiable" i> est une réclamation très grande!
@Nawaz Ce code est un idiome fixe et la norme mentionne explicitement que les compilateurs peuvent l'optimiser. Je suis raisonnablement sûr que même les compilateurs pas si récents font la bonne chose. Cela dit, je parle du monde réel. Bien sûr, tout le monde pourrait construire un compilateur conforme juste pour violer cette déclaration. Mais ce n'est pas vraiment pertinent.
Bien que le compilateur élimine des copies inutiles, il serait toujours nécessaire qu'un constructeur de copie soit accessible.
Même Visual C ++ 6 le fait, même dans le débogage i>. Ne peut plus trouver la source pour cela, cependant.
@Konrad: une légère variation, et le constructeur de copie n'a pas été élu (causant toute la manière de chagrin): Stackoverflow.com/questions/5305391/...
@Ben Désolé mais c'est un cas COM-PUR-PUR. Cette question était spécifiquement sur la construction par défaut une valeur modélisée non sur la copie élision des valeurs de retour. t x = t () code> est un cas d'usage commun et connu, car il est souvent nécessaire i> pour empêcher l'analyse la plus vexante de
t x () code> (et les goûts). Chaque fournisseur de compilateur sait s'attendre à cela.
@Konrad: Cette question me semble telle que c'est à propos de l'élition de la copie de la valeur de retour à partir du constructeur par défaut. VRAI L'autre exemple n'est pas un constructeur par défaut, mais c'est autrement similaire.
Pour ceux qui pensent ... J'ai déjà vu cette question auparavant, aujourd'hui ... ils ont raison. Mais cet aspect même de cette question est resté sans réponse.
@xtofl: Qu'est-ce que template-fu i>?
@Nawaz: la version C ++ de Kung Fu i>.
@Ben: cool. Ce terme est-il assez populaire dans la communauté C ++? Ou nouvellement inventé?
@Nawaz: [quoi que ce soit] -fu est populaire. Surtout vu dans des phrases comme "mon python-fu n'est pas assez fort".
@Nawaz: Le postfix 'Fu' est souvent utilisé pour indiquer «Haute compétence». Analogue au "script-fu" OFT-utilisé. Désolé d'avoir Con-Fu-Zed You.