Confusion d'analyse la plus vexante : clarifier l'ambiguïté
En C 11, les initialiseurs uniformes introduisent une ambiguïté subtile connue sous le nom de « analyse la plus vexante ». Examinons un exemple qui illustre ce problème :
<code class="cpp">#include <iostream> 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>
Analyse :
Dans la première ligne :
<code class="cpp">auto dv = Timer();</code>
Dans la deuxième ligne :
<code class="cpp">int time_keeper(Timer());</code>
Pour le prouver, considérons le programme suivant :
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>
Ce programme se compile avec succès, confirmant que time_keeper prend un pointeur vers une fonction comme argument.
En conclusion, la confusion de "l'analyse la plus frustrante" vient du fait que l'expression Timer() peut être interprétée comme soit un objet de type Timer, soit un pointeur de fonction vers une fonction qui renvoie un Timer. L'interprétation correcte dépend du contexte dans lequel l'expression est utilisée.
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!