{"id":246,"date":"2008-11-17T18:15:00","date_gmt":"2008-11-17T16:15:00","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=246"},"modified":"2008-11-17T18:15:00","modified_gmt":"2008-11-17T16:15:00","slug":"c-le-probleme-des-variables-temporaires","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/11\/c-le-probleme-des-variables-temporaires\/","title":{"rendered":"C++ &#8211; le probl\u00e8me des variables temporaires"},"content":{"rendered":"<p>Imaginons une fonction retournant un std::string par valeur:<\/p>\n<pre class=\"codesource\">\r\nstd::string foo()\r\n{\r\n  <span class=\"reservedname\">return<\/span> std::string();\r\n}\r\n<\/pre>\n<p>Lors du return, le compilateur cr\u00e9e une variable temporaire et celle-ci existe jusqu&rsquo;\u00e0 ce que la fonction se termine. Cela ne pose pas de probl\u00e8me si vous utilisez cette variable temporaire de cette mani\u00e8re:<\/p>\n<pre class=\"codesource\">\r\nstd::string str = foo();\r\n<\/pre>\n<p>Une copie de la variable temporaire est assign\u00e9e \u00e0 <em>str<\/em> et lorsque la fonction se termine, la variable temporaire est d\u00e9truite. Sa valeur a \u00e9t\u00e9 transmise par copie \u00e0 <em>str<\/em>. Tout va bien.<\/p>\n<p>Un probl\u00e8me peut se pr\u00e9senter si vous assignez cette variable temporaire \u00e0 une r\u00e9f\u00e9rence non constante:<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">const<\/span> std::string&amp; str = foo();\r\n<\/pre>\n<p>Le type de retour de <em>foo()<\/em> sp\u00e9cifie qu&rsquo;un string est retourn\u00e9 par valeur. C&rsquo;est \u00e0 dire qu&rsquo;une copie de la variable temporaire est cr\u00e9\u00e9e et li\u00e9e \u00e0 votre r\u00e9f\u00e9rence et sa dur\u00e9e de vie est \u00e9gale \u00e0 celle de la r\u00e9f\u00e9rence. Il faut bien comprendre que la variable temporaire cr\u00e9\u00e9e lors du return n&rsquo;est pas la m\u00eame que celle cr\u00e9\u00e9e par copie et li\u00e9e \u00e0 la r\u00e9f\u00e9rence.<\/p>\n<p>Par contre, lier une variable temporaire \u00e0 une r\u00e9f\u00e9rence non constante n&rsquo;est pas permis par la norme:<\/p>\n<pre class=\"codesource\">\r\nstd::string&amp; str = foo();   <span class=\"codecomment\">\/\/ill\u00e9gal<\/span>\r\n<\/pre>\n<p>La norme pr\u00e9cise qu&rsquo;une variable temporaire li\u00e9e \u00e0 une r\u00e9f\u00e9rence est une <em>rvalue<\/em> (expression \u00e0 droite du signe =) et donc on ne peut pas lui assigner une valeur ni la modifier. En cons\u00e9quence lier une variable temporaire \u00e0 une r\u00e9f\u00e9rence non constante viole cette r\u00e8gle. Et ce n&rsquo;est donc pas permis.<\/p>\n<p>Le code de bonne pratique veut donc que vos r\u00e9f\u00e9rences soient constantes par d\u00e9faut. Ne les rendez non constantes que si c&rsquo;est absolument n\u00e9cessaire. Et si vraiment vous devez modifier une r\u00e9f\u00e9rence, pourquoi ne pas utiliser un pointeur?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imaginons une fonction retournant un std::string par valeur: std::string foo() { return std::string(); } Lors du return, le compilateur cr\u00e9e une variable temporaire et celle-ci existe jusqu&rsquo;\u00e0 ce que la fonction se termine. Cela ne pose pas de probl\u00e8me si vous utilisez cette variable temporaire de cette mani\u00e8re: std::string str = foo(); Une copie de [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/246"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=246"}],"version-history":[{"count":4,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/246\/revisions"}],"predecessor-version":[{"id":250,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/246\/revisions\/250"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}