<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alp Mestan :: Blog &#187; Evolution du C++</title>
	<atom:link href="https://blog.developpez.com/alp/pcategory/c/evolution-du-c/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/alp</link>
	<description></description>
	<lastBuildDate>Fri, 28 Aug 2009 11:58:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>En route pour C++0x : nullptr, le pointeur nul revisité</title>
		<link>https://blog.developpez.com/alp/p6254/c/en_route_pour_c_0x_nullptr_le_pointeur_n</link>
		<comments>https://blog.developpez.com/alp/p6254/c/en_route_pour_c_0x_nullptr_le_pointeur_n#comments</comments>
		<pubDate>Fri, 22 Aug 2008 16:46:24 +0000</pubDate>
		<dc:creator><![CDATA[Alp]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Evolution du C++]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quel programmeur C++ ne s&#8217;est jamais posé des questions quand à l&#8217;utilisation des pointeurs nuls ? Faut-il utiliser NULL ou 0 ? Ou encore (void*)0 ? Depuis bientôt 30 ans, c&#8217;est un sujet à problème et la polémique l&#8217;entourant est grande. C&#8217;est pourquoi le comité ISO de normalisation du C++ a fait le choix de mettre en place un nouvel objet dans la prochaine norme (C++0x) : nullptr. Un problème, à l&#8217;origine Considérons le code [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quel programmeur C++ ne s&rsquo;est jamais posé des questions quand à l&rsquo;utilisation des pointeurs nuls ? Faut-il utiliser NULL ou 0 ? Ou encore (void*)0 ? Depuis bientôt 30 ans, c&rsquo;est un sujet à problème et la polémique l&rsquo;entourant est grande. C&rsquo;est pourquoi le comité ISO de normalisation du C++ a fait le choix de mettre en place un nouvel objet dans la prochaine norme (C++0x) : <strong>nullptr</strong>.<br />
<span id="more-9"></span></p>
<p><strong>Un problème, à l&rsquo;origine</strong><br />
Considérons le code suivant.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void f(int); <br />
void f(char *); <br />
// ... plus loin dans le code ... <br />
f(0);</div></div>
<p>Quelle fonction est appellée ? f(int) ou f(char *) ? C&rsquo;est f(int) qui sera toujours appelée, même si vous vouliez appeler l&rsquo;autre, en passant donc un pointeur nul.<br />
Comment appeler l&rsquo;autre alors, lorsque l&rsquo;on veut passer un pointeur nul ?<br />
Il faut recourir à une conversion explicite.<br />
<code class="codecolorer text default"><span class="text">f( (char*)0 );</span></code><br />
Pas très intuitif ni agréable n&rsquo;est-ce pas ?</p>
<p>On peut se demander si NULL ne résoud pas le problème, maintenant. Hélas non, car sur un compilateur qui respecte la norme, NULL a pour valeur 0&#8230; ni (void *)0 ni quoique ce soit d&rsquo;aute, <strong>0</strong> simplement.<br />
Ce qui entraine donc que :<br />
<code class="codecolorer text default"><span class="text">f(NULL);</span></code><br />
appellera f(int) encore une fois.</p>
<p>Il y a d&rsquo;autres situations qui posent problème : toutes celles où l&rsquo;on voudrait avoir un objet qui désigne un pointeur nul mais où l&rsquo;on ne dispose que de la valeur littérale 0.</p>
<p>Beaucoup de suggestions et propositions ont été apportées mais il y a une solution dans la prochaine norme qui règlera ces problèmes : <strong>nullptr</strong>.</p>
<p><strong>nullptr, la solution</strong><br />
<em>nullptr</em> est un mot-clé réservé du langage qui désigne une rvalue constante de type <em>std::nullptr_t</em>. L&rsquo;implémentation du type en question est laissée à l&rsquo;appréciation des compilateurs. On est toutefois sûr d&rsquo;en disposer sur un compilateur qui implémente(ra) la norme C++0x.</p>
<p>Voici des exemples d&rsquo;utilisation :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">//pointers and numeric types <br />
char *pc=nullptr; //OK <br />
char c=nullptr; //error, type mismatch <br />
int num=nullptr; //error, type mismatch <br />
&nbsp;<br />
//pointers to members <br />
int (A::*pmf)(char *)=nullptr; //OK <br />
int A::*pmi=nullptr; //OK, pointer to data member &nbsp;<br />
&nbsp;<br />
//comparisons <br />
if (nullptr==0) //error, type mismatch <br />
if (nullptr)//error, conversion to bool not allowed <br />
if (pc==nullptr) //OK</div></div>
<p>tirés de <a href="http://www.devx.com/cplus/10MinuteSolution/35167/1954">cet article</a>.</p>
<p>Enfin, notre problème de départ est facilement résolu. Si l&rsquo;on veut appeler f(char*) en lui donnant un pointeur nul, il nous suffit d&rsquo;écrire <em>f(nullptr)</em>.</p>
<p>Voici donc un nouveau billet sur les nouveautés de C++0x. D&rsquo;autres devraient suivre petit à petit.</p>
<p>Bonne lecture.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En route pour C++0x : Les variadic templates</title>
		<link>https://blog.developpez.com/alp/p6193/c/en_route_pour_cpp0x_variadic_templates</link>
		<comments>https://blog.developpez.com/alp/p6193/c/en_route_pour_cpp0x_variadic_templates#comments</comments>
		<pubDate>Tue, 12 Aug 2008 03:25:21 +0000</pubDate>
		<dc:creator><![CDATA[Alp]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Evolution du C++]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui je vais tenter de vous intéresser à une possibilité du C++ qui ne prendra effet qu&#8217;après la publication de la prochaine norme (C++0x, qui devrait si tout va bien devenir C++09), le temps que les compilateurs l&#8217;implémentent, qui est résumée sous le doux nom de variadic templates. Est-ce que vous vous souvenez de la fonction printf de la bibliothèque standard C ? Au cas où, je vous rappelle son prototype : int printf (const [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui je vais tenter de vous intéresser à une possibilité du C++ qui ne prendra effet qu&rsquo;après la publication de la prochaine norme (C++0x, qui devrait si tout va bien devenir C++09), le temps que les compilateurs l&rsquo;implémentent, qui est résumée sous le doux nom de <strong>variadic templates</strong>.</p>
<p>Est-ce que vous vous souvenez de la fonction <strong>printf</strong> de la bibliothèque standard C ?<br />
Au cas où, je vous rappelle son prototype :<br />
<code class="codecolorer text default"><span class="text">int printf (const char *format, ...);</span></code><br />
Vous vous souvenez aussi probablement que les &laquo;&nbsp;&#8230;&nbsp;&raquo; permettent de donner autant d&rsquo;arguments que l&rsquo;on souhaite à printf et que l&rsquo;on appelle cela les <em>ellipses</em>. Les fonctions qui utilisent ceci sont appelées <strong>fonctions variadiques</strong>.<br />
Avec le C++ actuel, nous pouvons toujours utiliser cette technique.</p>
<p>Seulement, une grande nouveauté va être apportée au C++. Elle reprend l&rsquo;idée des <strong>fonctions variadiques</strong> mais pour l&rsquo;appliquer&#8230; aux paramètres d&rsquo;une <strong>fonction</strong> ou <strong>classe template</strong> !<br />
<center><img src="http://www.beust.com/pics/cplusplus-0x.png" alt="C++0x" title="C++0x" /></center><br />
<span id="more-8"></span></p>
<p>En effet, nous allons en C++0x pouvoir créer des classes et fonctions templates pouvant accepter un <strong>nombre arbitraire d&rsquo;arguments</strong> (pour les fonctions) et <strong>de paramètres</strong> (pour les classes/structures), non fixé à l&rsquo;avance.</p>
<p>Pour mieux vous présenter comment cela sera fait, je vais d&rsquo;abord donner quelques définitions.</p>
<ul>
<li><em>template parameter pack</em> : c&rsquo;est un paramètre template qui accepte zéro ou plus arguments templates. On donne généralement l&rsquo;exemple suivant.<br />
    <code class="codecolorer text default"><span class="text">template&lt;class ... Types&gt; struct Tuple { };</span></code><br />
    Ici <em>class &#8230; Types</em> est donc un <strong>template parameter pack</strong>. Sachez aussi que c&rsquo;est cette syntaxe qui sera utilisée en C++0x.</li>
<li><em>function parameter pack</em> : c&rsquo;est un paramètre de fonction qui accepte zéro ou plus arguments de fonctions. Un exemple illustrant mes propos ci-dessous.<br />
    <code class="codecolorer text default"><span class="text">template&lt;class ... Types&gt; void f(Types ... args);</span></code><br />
    Ici <em>Types &#8230; args</em> est un <strong>function parameter pack</strong>. Ici aussi on est en présence de la syntaxe définitive adoptée pour C++0x.</li>
<li>On dénote par <em>parameter pack</em> soit un <em>template parameter pack</em> soit un <em>function parameter pack</em>.</li>
<li><em>pack expansion</em> : c&rsquo;est une expression qui permet de donner à une fonction, une liste d&rsquo;initialisation, etc un ou plusieurs <em>parameter packs</em>. Voici un exemple.
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">template&lt;class ... Types&gt; void f(Types ... rest); <br />
template&lt;class ... Types&gt; void g(Types ... rest) { <br />
f(&amp;rest ...); <br />
}</div></div>
<p>Ici <em>&#038;rest &#8230;</em> est une <em>pack expansion</em>.</li>
</ul>
<p>Et maintenant, il ne reste plus qu&rsquo;à présenter la règle qui définit l&rsquo;utilisation des expansions :</p>
<blockquote><p>Un <em>parameter pack</em> dont le nom apparaît dans une <em>pack expansion</em> est &laquo;&nbsp;étendu&nbsp;&raquo; par cette <em>pack expansion</em>. Toutefois, l&rsquo;expansion ne se fait que par la <em>pack expansion</em> la plus intérieure (par rapport aux parenthèses et chevrons ( < et > ) qui ne doit toutefois pas être plus intérieure que le <em>parameter pack</em>.</p></blockquote>
<p>Illustration en code.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">template&lt;class ... Types&gt; void f(Types ... rest); <br />
&nbsp;<br />
template&lt;class ... Args&gt; void g(Args ... args) { <br />
f(const_cast&lt;const Args*&gt;(&amp;args)...); // Args et args sont étendus <br />
f(5 ...); // erreur car l'expression ne contient aucun parameter pack <br />
f(args); // erreur car le parameter pack 'args' n'est pas étendu <br />
f(h(args ...) + args ...); // le premier 'args ...' est étendu dans h et le second dans f <br />
}</div></div>
<p>Tout cela permettra d&rsquo;écrire un code encore plus générique, notamment pour représenter des <em>n-uplets</em> (au sens mathématique) que l&rsquo;on dénote généralement par <em>tuples</em> en programmation, ainsi que des classes utilitaires autour des fonctions et foncteurs comme Boost.Bind, Boost.Function, etc. Cette nouvelle possibilité fera donc des heureux dans l&rsquo;univers de la programmation générique en C++ car elle apporte un plus à un programme de nouveautés autour des templates déjà bien chargé.</p>
<p>Je vous conseille de consulter <a href="http://www.open-std.org/jtc1/sc22/wg21/">le site du commité ISO de normalisation du C++</a> pour obtenir plus de détails sur toutes ces choses.</p>
<p>Ce billet a été écrit en se basant sur la version du 26 Juin 2008 du brouillon de la norme de C++0x et utilise les exemples donnés dans le document en question.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evolution du C++</title>
		<link>https://blog.developpez.com/alp/p3994/c/evolution_du_c</link>
		<comments>https://blog.developpez.com/alp/p3994/c/evolution_du_c#comments</comments>
		<pubDate>Tue, 24 Jul 2007 12:05:57 +0000</pubDate>
		<dc:creator><![CDATA[Alp]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Evolution du C++]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, L&#8217;évolution du C++ est le centre d&#8217;intérêt de la planète entière depuis quelques temps. (ou presque&#8230;) D&#8217;une part, le comité de normalisation du C++ prépare la prochaine version, C++0x, pour 2009 (si la nouvelle version est finalisée en 2009, C++0x deviendra C++09). D&#8217;autre part, ils se penchent également sur la nouvelle bibliothèque standard avec bien plus de choses qu&#8217;actuellement. Vous pouvez trouver des informations sur le site du comité : http://www.open-std.org/JTC1/SC22/WG21/ . Le but [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>L&rsquo;évolution du C++ est le centre d&rsquo;intérêt de la planète entière depuis quelques temps.<br />
(ou presque&#8230;)</p>
<p>D&rsquo;une part, le comité de normalisation du C++ prépare la prochaine version, C++0x, pour 2009 (si la nouvelle version est finalisée en 2009, C++0x deviendra C++09).<br />
D&rsquo;autre part, ils se penchent également sur la nouvelle bibliothèque standard avec bien plus de choses qu&rsquo;actuellement. Vous pouvez trouver des informations sur le site du comité : http://www.open-std.org/JTC1/SC22/WG21/ .</p>
<p>Le but est de fournir le plus de facilités au programmeur C++ de manière portable et efficace, en lui mettant à disposition des outils génériques et flexibles.<br />
On retrouve notamment pour la future SL des threads, description de types, des expressions régulières &#8230; </p>
<p>Quand à la prochaine version de C++, elle fournira quelques nouveaux mots-clés comme <strong>requires</strong> ou <strong>decltype</strong>, entre autres, et fournira la notion de <strong>concept</strong>, qui va s&rsquo;avérer pratique pour ceux qui utilisent la programmation générique.</p>
<p>Encore une fois, le meilleur moyen de découvrir tout ça est le site du comité, dont je redonne le lien ici : <a href="http://www.open-std.org/JTC1/SC22/WG21/">Comité ISO C++</a>.</p>
<p>Bonne lecture.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
