J'ai eu du mal à déboguer un crash sur la production. Je voulais juste confirmer avec les gens ici la sémantique. Nous avons une classe comme ...Ctor Initializer: l'auto-initialisation provoque un crash?
class Test {
public:
Test()
{
// members initialized ...
m_str = m_str;
}
~Test() {}
private:
// other members ...
std::string m_str;
};
Quelqu'un a modifié l'initialisation d'utiliser des listes d'initialisation-ctor qui est raisonnablement correct dans notre sémantique de code. L'ordre d'initialisation et leur valeur initiale est correcte entre autres. Donc la classe ressemble à ...
class Test {
public:
Test()
: /*other inits ,,, */ m_str(m_str)
{
}
~Test() {}
private:
// other members ...
std::string m_str;
};
Mais le code a soudainement commencé à planter! J'ai isolé la longue liste d'inits à ce morceau de code m_str(m_str)
. Je l'ai confirmé via link text.
Faut-il tomber en panne? Que dit la norme à ce sujet? (Est-ce un comportement indéfini?)
Vous initialisez m_str avec lui-même? Pourquoi fais-tu ça? – Starkey
Un comportement indéfini signifie qu'il peut formater votre disque c et installer un autre système d'exploitation. Personne ne sait quel "comportement non défini" signifie sur un environnement particulier. –
le code de quelqu'un d'autre, je vais le changer, mais j'ai besoin de la confirmation de la norme qu'il est en effet un comportement non défini, parce qu'il ne plante pas pour les types de POD comme 'int i; i (i) 'dans la liste des initialiseurs – Abhay