\chapter{C++ 2011} Nouveau standard depuis 2011, la dernière révision était la première de 1998. Nécessite GCC-4.6 ou clang 3.0. Le premier vrai compilateur C++ est G++, avant il n'y en avait pas vraiment. Clang, démarré il y a une 10aine d'année, autour de LLVM. Clang est plus moderne, écrit en C++, de manière modulaire. Il donne généralement des meilleurs erreurs que G++. Il n'implémente cependant pas encore toutes les fonctionnalités du standard. \section{nullptr} Il s'agit d'une constante. \begin{verbatim} void f(int); void f(void*); \end{verbatim} On a une ambiguité lorsque l'on appelait \verb+f(0)+. \section{range-based for} \begin{verbatim} for (const int& v : l) std::cout << v << std::endl; \end{verbatim} Avant il y avait bien la macro \verb+BOOST_FOREACH+, mais elle produisait évidemment des messages d'erreurs très peu compréhensible ! \section{Les chevrons fermants dans les templates} \begin{verbatim} std::vector > matrix ^ \end{verbatim} Dans le nouveau standard, il est donc maintenant possible de coller les deux \verb+>>+. Il s'agissait d'un problème de priorité des opérateurs. \section{Code compilé dans notre dos~!} Le code suivant~: \begin{verbatim} struct A { }; \end{verbatim} Génére le code suivant pour le compilateur~: \begin{lstlisting} struct A { A (); A (const A&); ~A (); A& operator= (const A&); }; \end{lstlisting} C'est pour que les classes en C++ ressemblent par défaut au C. Par moment, il est parfois nécessaire de désactiver (par exemple on ne veut pas autoriser la copie d'un singleton). Pour supprimer explicitement une méthode, on fait de cette manière~: \begin{lstlisting} struct A { A (const A&) = delete; A& operator= (const A&) = delete; }; \end{lstlisting} Également, lorsque l'on crée un constructeur avec un argument, le constructeur sans argument est automatiquement désactivé. Pour le réactiver, on fait~: \begin{lstlisting} struct A { A (int i); A () = default; }; \end{lstlisting} \paragraph{Design Pattern~:} une recette générale pour résoudre des problèmes généraux. \section{Genre d'inférence de type} Si l'on veut instancier la classe \verb+VeryLongType+ de façon dynamique : \begin{lstlisting} VeryLongType* v = new VeryLongType(...); ^^^^^^^^^^^^^ auto v = new VeryLongType(...); \end{lstlisting} Ces deux constructions fonctionnent en C++2011. En utilisant \verb+auto+, le compilateur va déduire le type. \paragraph{Changement de auto} avant, \verb+auto+ permettaient de préciser où placer une variable (avec \verb+register+)~: dans un registre ou dans la mémoire. Mais ce n'est plus utile maintenant avec le grand nombre de registre des processeurs~; et surtout on a de nombreux algos qui sont très performants pour déterminer le meilleurs endroit. \chapter{AST} \paragraph{Tips pour TC2~:} utiliser la commande \verb+patch+ pour appliquer les patchs. Mais cette année, on pourrait faire un merge avec un dépôt public. La construction d'objets se déroule de la classe la plus supérieure à la classe de base (dans le cas d'héritage). La destruction se fait dans l'autre sens.