J'ai du mal à comprendre le paragraphe suivant cité dans cppreference sur le constructeur par défaut trivial. J'ai recherché stackoverflow mais je n'ai toujours pas obtenu de réponse claire. Alors s'il vous plaît, aidez-moi.
Un constructeur par défaut trivial est un constructeur qui n'effectue aucune action. Tous les types de données compatibles avec le langage C (types POD) sont trivialement constructibles par défaut. Contrairement à C, cependant, les objets avec des constructeurs par défaut triviaux ne peuvent pas être créés en réinterprétant simplement le stockage correctement aligné, comme la mémoire allouée avec std :: malloc: placement-new est requis pour introduire formellement un nouvel objet et éviter un comportement potentiellement indéfini.
Plus précisément, si le constructeur par défaut trivial ne fait rien, pourquoi ne pouvons-nous pas réinterpréter le stockage et prétendre qu'il existe un objet avec le type donné? Pourriez-vous s'il vous plaît fournir quelques exemples pour le comportement non défini potentiel que cela pourrait provoquer?
la source
*reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;
. C ++ a un concept d'objets et de durées de vie d'objet, spécifié sur la machine abstraite, et ce n'est pas parce qu'il n'y a pas d'instructions CPU pour créer un objet à partir du stockage qu'il n'y a pas de différence sur la machine abstraite.Réponses:
P0593R5 donne cet exemple:
et explique:
En pratique, cela fonctionne et la situation UB est davantage considérée comme un défaut de la norme qu'autre chose. L'objectif global du document est de proposer un moyen de résoudre ce problème et des cas similaires sans casser d'autres choses.
la source
Pour des raisons de "pureté".
L'alternative et le statu quo actuel étaient que chaque région de stockage contiendrait tous les objets convenant à ce stockage, en même temps. Certains membres du comité sont inquiets du statu quo et beaucoup de gens craignent la notion d'avoir une infinité d'objets au même endroit (dans un état virtuel non initialisé).
Personne n'a jamais été en mesure de montrer un problème logique avec la présence infinie d'objets dans une région de stockage.
Parce qu'ils avaient différentes sections de la norme disant des choses contradictoires, les membres du comité ont simplement décidé de prendre au sérieux l'une des pires parties de la norme.
En outre, l'utilisation de littéraux de chaîne n'est strictement pas autorisée, si vous prenez vraiment au sérieux cette partie de la norme.
la source
type_info
objets. Avez-vous signalé des littéraux de chaîne?