Analyse la plus vexante : lever l'ambiguïté en C 11
L'ambiguïté de "l'analyse la plus vexante" en C 11 se présente lors de l'utilisation d'initialiseurs uniformes, comme en témoigne l'extrait de code suivant :
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // Ambiguity: Object or function call? int time_keeper(Timer()); // Ambiguity: Pointer or call? return 0; }</code>
Comprendre la première expression (auto dv = Timer())
Dans la première expression, le mot-clé auto implique que le type de dv est déduit de l'initialiseur situé à droite du signe égal (=). L'initialiseur est un appel au constructeur Timer sans argument, qui renvoie un objet Timer. Par conséquent, dv est un objet de type Timer.
Comprendre la deuxième expression (int time_keeper(Timer()))
Dans la deuxième expression, l'ambiguïté surgit car le compilateur ne peut pas déterminer si Timer() est un appel de fonction ou un objet de type Timer passé par référence.
Cependant, comme les fonctions se désintègrent en pointeurs lorsqu'elles sont passées en arguments, le vrai type de time_keeper est int(Timer(*)()), qui résout le ambiguïté en faveur de l'interprétation pointeur vers fonction.
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!