2010-03-27 6 views
8
std::string x(x); 

Cela se bloque très mal sur mon compilateur. Cela signifie-t-il que je devrais tester this != &that dans mes propres constructeurs de copie, ou puis-je supposer qu'aucun client ne sera jamais aussi stupide?std :: string x (x);

+0

Voulez-vous dire que le programme résultant se bloque ou que le compilateur lui-même se bloque? –

+0

Dans un constructeur de copie qui n'est pas nécessaire, mais vous devez vérifier cela dans un opérateur d'affectation. –

+1

Le programme résultant se bloque à l'exécution. – fredoverflow

Répondre

6

L'initialisation d'un élément avec lui-même est un comportement indéfini, ce qui peut même signifier qu'une fois invoqué, vous ne pourrez même pas le détecter ultérieurement. Supposons que le compilateur le détecte et que, par dépit, il génère un assemblage pour les démons nasaux, pas un appel à votre constructeur de copie du tout?

En pratique, vous pouvez supposer que le client n'est pas si stupide, et si c'est le cas, il est de leur devoir de le déboguer et de le comprendre.

+1

Où exactement la norme dit-elle que ce comportement n'est pas défini? – fredoverflow

+1

Honnêtement, je suis surpris qu'il compile même. Le problème est que le constructeur de copie de 'std :: string' va essayer d'appeler les méthodes/accéder aux données dans' x', mais 'x' n'a pas encore été construit. Par conséquent, il s'agit d'un comportement non défini car il essaie de faire des choses avec une variable qui n'a pas encore été construite. –

+0

@FredOverflow: Je pense qu'une partie de la norme pertinente est le "point de déclaration" (3.3.1). Il est également possible que cela ait des utilisations significatives, par exemple si la classe stocke une référence à une autre instance de la classe (ou elle-même), alors nous pourrions faire par exemple: 'X x (" self ", x); X y ("autre", x); etc. Dans ce cas, je suppose que les règles seraient similaires à l'utilisation de ** this ** dans une liste d'initialisation de classe. – UncleBens

9

Vous ne devriez pas effectuer de test sur un code qui tente de provoquer un crash grave. Voir Null References. Il dit

"Tout comme vous devez supposer qu'un pointeur non nul est valide, vous devez supposer qu'une référence est valide Vous devez avoir confiance dans les autres programmeurs."

Je veux compléter

... vous devez supposer que la source d'une copie est valide.

Si vous "réparer" votre cas, que faire pour celui-ci?

string x = string(x); 
2

Ce code n'est pas correct selon la norme et il n'a pas de sens de le vérifier et la meilleure chose qui puisse arriver est un échec rapide afin que l'utilisateur peut corriger leur code.