Maison >développement back-end >C++ >Pouvez-vous passer un objet dans son propre constructeur en C ?

Pouvez-vous passer un objet dans son propre constructeur en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-11 05:06:02326parcourir

Can You Pass an Object into Its Own Constructor in C  ?

Passer un objet dans son propre constructeur en C

Certains programmeurs C ont découvert un comportement intrigant : passer un objet dans son propre constructeur. Cela soulève des questions quant à savoir si une telle pratique est légale ou considérée comme un comportement indéfini en C .

Considérez l'extrait de code suivant :

#include <iostream>

struct Foo {
    Foo(Foo& bar) {
        std::cout << &bar << std::endl;
    }
};

int main() {
    Foo foo(foo); // Surprisingly, this compiles and executes
    std::cout << &foo << std::endl;
}

Dans ce code, le constructeur Foo reçoit une référence au objet construit lui-même avant que l'objet ne soit complètement initialisé. Bien que l'objet ne soit pas initialisé, le code est autorisé par la norme C.

La section 3.8 du projet de norme C 14 précise qu'avant le début de la durée de vie d'un objet (ou après sa fin), il est autorisé à prendre son adresse ou y lier une référence tant que la référence peut se lier directement. Un comportement non défini se produit uniquement lorsque certaines opérations, telles que les conversions lvalue en rvalue, l'accès aux données membres non statiques ou la liaison de classe de base virtuelle, sont effectuées sur de tels objets partiellement initialisés.

L'exemple de code fourni ne le fait pas. violer l’une de ces restrictions. Nous lions simplement une référence et obtenons l'adresse au sein du constructeur, ce qui est autorisé.

Le problème actif 453, cependant, soulève des inquiétudes quant à la validité des références contraignantes à des objets non initialisés. Le langage proposé initialement prend en charge Defect Report 363, qui permet une telle liaison, comme démontré dans l'extrait de code.

Bien que ce comportement puisse paraître étrange au départ, il est le résultat de l'allocation d'espace par le compilateur à l'objet avant l'initialisation. Cela permet des opérations limitées, telles que la liaison de références et la récupération d'adresses, sans produire de valeurs indéterminées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn