Maison > développement back-end > C++ > le corps du texte

`Timer()` est-il un appel de constructeur ou un appel de fonction ? L'ambiguïté « l'analyse la plus vexante » en C

Susan Sarandon
Libérer: 2024-11-02 13:25:30
original
853 Les gens l'ont consulté

Is `Timer()` a Constructor Call or a Function Call? The

L'ambiguïté de « l'analyse la plus vexante » : démêler les initialiseurs uniformes

Dans le domaine de C, l'ambiguïté de « l'analyse la plus vexante » peut surgir lorsque vous rencontrez des initialiseurs uniformes, comme illustré par le code suivant :

<code class="cpp">class Timer {
public:
    Timer() {}
};

int main() {
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument "Timer (*) ()"?
    return 0;
}</code>
Copier après la connexion

Interprétation de dv

Dans la ligne auto dv = Timer();, le type de dv dépend de l’interprétation de Timer(). Cela peut être :

  • Un appel de constructeur, instanciant un objet de type Timer.
  • Un appel de fonction à une hypothétique surcharge d'opérateur() dans Timer, puisqu'une initialisation uniforme peut être utilisée pour invoquer des appels de fonction.

Dans ce cas, cela signifie un appel de constructeur, ce qui fait que dv est un objet de type Timer. Le mot-clé auto déduit le type en fonction de l'initialiseur.

Comprendre time_keeper

Dans la ligne int time_keeper(Timer());, une fonction nommée time_keeper est déclarée. L'argument n'est pas un pointeur de fonction de type Timer (*) (), comme on pourrait s'y attendre. Il représente plutôt un pointeur vers une fonction qui renvoie un Timer et ne prend aucun argument. En effet :

  • Les fonctions se désintègrent implicitement en un pointeur vers une fonction lorsqu'elles sont passées en arguments.
  • Dans ce cas spécifique, l'appel de fonction se désintègre en un pointeur vers une fonction qui renvoie un Timer et ne prend aucun argument, c'est-à-dire Timer(*)().

En conclusion

L'ambiguïté de « l'analyse la plus vexante » met en évidence le potentiel de confusion lors de l'interprétation de certaines constructions en C . Comprendre le concept d'initialisation uniforme et de dégradation des fonctions est crucial pour comprendre correctement de tels scénarios.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!