Maison >développement back-end >C++ >`Timer()` est-il un appel de constructeur ou un appel de fonction ? L'ambiguïté « l'analyse la plus vexante » en C
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 :
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 :
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!