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

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 13:25:30854parcourir

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>

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!

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