Passer des objets C dans leurs propres constructeurs
En C , cela peut paraître contre-intuitif mais il est en effet légal de passer un objet C dans son propre constructeur. Considérez l'extrait de code suivant :
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // Surprising, yet valid std::cout << &foo << std::endl; }
Dans cet exemple, nous transmettons l'adresse de l'objet Foo construit (&foo) dans son propre constructeur. Cela peut ressembler à une définition circulaire, mais ce n'est pas considéré comme un comportement indéfini par les normes C.
Explication
La norme nous permet d'utiliser des objets non initialisés de manière limitée avant leur initialisation complète. En particulier, il est permis d'y lier une référence ou de prendre son adresse. Ceci est défini dans le rapport de défauts 363 et la section 3.8 du projet de norme C 14.
Cela signifie que dans le code ci-dessus, nous ne violons aucune contrainte fixée par le langage. Nous utilisons simplement l'objet foo non initialisé dans le constructeur d'une manière conforme à la norme.
Avertissement de Clang
Cependant, il convient de noter que certains compilateurs comme Clang peut émettre un avertissement concernant les variables non initialisées. En effet, la production de valeurs indéterminées à partir de variables automatiques non initialisées est généralement considérée comme un comportement indéfini. Dans ce cas, cependant, nous n'introduisons pas d'indétermination puisque nous lions uniquement une référence et prenons l'adresse au sein du constructeur.
Limitations
Il est important de souligner que même si ce comportement est autorisé par la norme, il ne doit pas être considéré comme une bonne pratique ni avoir de cas d'utilisation pratique. L'intention première de cette discussion est de mettre en lumière un aspect moins connu de la sémantique du langage C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!