{"id":666,"date":"2010-09-04T15:15:41","date_gmt":"2010-09-04T14:15:41","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=666"},"modified":"2010-09-09T20:49:29","modified_gmt":"2010-09-09T19:49:29","slug":"breaking-change-in-vc-2010-in-der-stl-wird-0-bzw-null-nicht-mehr-gueltiger-zeiger-akzeptiert","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/04\/breaking-change-in-vc-2010-in-der-stl-wird-0-bzw-null-nicht-mehr-gueltiger-zeiger-akzeptiert\/","title":{"rendered":"Breaking-Change: In VC-2010 in der STL wird 0 bzw. NULL nicht mehr g\u00fcltiger Zeiger akzeptiert"},"content":{"rendered":"<p>Die <em>STL<\/em> Implementierung wurde klar hinsichtlich <em>&#8222;perfect forwarding&#8220; <\/em>\u00fcberarbeitet (Siehe C++0x). Allerdings sind dabei auch einige Sachen reingerutscht die dazu f\u00fchren, dass sich mancher Code nicht mehr kompilieren l\u00e4sst.<\/p>\n<p>So f\u00fchren die nachfolgenen Zeilen zu einem Compiler Fehler:<\/p>\n<pre>std::pair&lt;void*,void*&gt; p(0, NULL);\r\n\/\/ fails with error C2440: 'initializing' : cannot convert from 'int' to 'void *'<\/pre>\n<p>Gleiches negatives Ergebnis erh\u00e4lt man, wenn man die folgenden Zeile kompiliert:<\/p>\n<pre>vector&lt;void*&gt; v;\u00a0\r\nv.insert(v.begin(),NULL);<\/pre>\n<p>Der Hintergrund wird hier in dieser Connect\u00a0Meldung beleuchtet:<br \/>\n<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/520043\/error-converting-from-null-to-a-pointer-type-in-std-pair?wa=wsignin1.0\">https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/520043\/error-converting-from-null-to-a-pointer-type-in-std-pair?wa=wsignin1.0<\/a><\/p>\n<p>Das Problem ist, das <em>0 (NULL)<\/em> sich zwar brav in einen <strong>Zeiger umwandeln <\/strong>l\u00e4sst.\u00a0<em>0 (NULL)<\/em> bleibt aber deshalb dennoch <strong>vom Typ her ein <em>int<\/em> <\/strong>ist wird nicht zu einem Zeiger. Die typensichere Implementierung in der <em>STL<\/em> f\u00fchrt nun dazu, dass <em>0 (NULL) <\/em>nicht als <em>void* <\/em>akzeptiert wird.<\/p>\n<p>Einzige L\u00f6sung und auch mein Rat:<br \/>\n<strong>Man verwendet nicht mehr <em>0 <\/em>oder <em>NULL<\/em>, wenn ein <em>NULL<\/em>-Zeiger gemeint ist, sondern <em>nullptr<\/em> \u2757<br \/>\n<\/strong>Wer Code kompatibel zu <em>VC-2008 <\/em>und fr\u00fcher halten muss, kann ja in seinen Headern den folgende Definition einf\u00fchren:<\/p>\n<pre>#if\u00a0 _MSC_VER&lt;1600\r\nconst int nullptr = 0;\r\n#endif<\/pre>\n<p>Mehr zu <em>perfect forwarding <\/em>liest man hier:<br \/>\n<a href=\"http:\/\/std.dkuug.dk\/jtc1\/sc22\/wg21\/docs\/papers\/2002\/n1385.htm\">http:\/\/std.dkuug.dk\/jtc1\/sc22\/wg21\/docs\/papers\/2002\/n1385.htm<\/a><br \/>\n<a href=\"http:\/\/thbecker.net\/articles\/rvalue_references\/section_07.html\">http:\/\/thbecker.net\/articles\/rvalue_references\/section_07.html<\/a><\/p>\n<p>Wie auch aus dem Connect Artikel zu entnehmen ist kann man damit rechnen, dass sich in <em>VC11 <\/em>alles wieder etwas zur\u00fcckentwickeln wird. D.h. <em>std::pair <\/em>und auch die <em>insert <\/em>Befehle der Container sollen wirde brav 0 aktzeptieren k\u00f6nnen, wenn Zeiger gemeint sind. Gleiches bekam ich auch \u00fcber meine Kontakte zur Produktgruppe zu h\u00f6hren. Aber was <em>VC11 <\/em>betrifft ist alles sowieso nur Zukunftsmusik und alles noch im dichten Nebel und was wirklich Realit\u00e4t wird \u00a0muss man dann wohl erst mal sehen \ud83d\ude09<\/p>\n<p><strong>Nachtrag vom 09.09.2010:<\/strong><br \/>\n<em>Dravere<\/em> hat in einem Kommentar auf eine geniale Implementierung f\u00fcr <em>nullptr<\/em> hingewiesen:<br \/>\n<a href=\"http:\/\/www.c-plusplus.de\/forum\/viewtopic-var-t-is-220511.html\">http:\/\/www.c-plusplus.de\/forum\/viewtopic-var-t-is-220511.html<\/a><br \/>\nDie ist weitaus besser als meine Definition als <em>const int<\/em>.<\/p>\n<pre lang=\"cpp\">const class\r\n{\r\npublic:\r\n  template&lt;class T&gt; operator T*() const {return 0;}\r\n  template&lt;class C, class T&gt; operator T C::*() const {return 0;}\r\nprivate:\r\n  void operator&amp;() const;\r\n}\r\nnullptr = {};<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die STL Implementierung wurde klar hinsichtlich &#8222;perfect forwarding&#8220; \u00fcberarbeitet (Siehe C++0x). Allerdings sind dabei auch einige Sachen reingerutscht die dazu f\u00fchren, dass sich mancher Code nicht mehr kompilieren l\u00e4sst. So f\u00fchren die nachfolgenen Zeilen zu einem Compiler Fehler: std::pair&lt;void*,void*&gt; p(0, NULL); \/\/ fails with error C2440: &#8218;initializing&#8216; : cannot convert from &#8218;int&#8216; to &#8218;void *&#8216; &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/04\/breaking-change-in-vc-2010-in-der-stl-wird-0-bzw-null-nicht-mehr-gueltiger-zeiger-akzeptiert\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBreaking-Change: In VC-2010 in der STL wird 0 bzw. NULL nicht mehr g\u00fcltiger Zeiger akzeptiert\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,172],"tags":[173,99,370,248,174,171],"class_list":["post-666","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-vs2010","tag-breaking-changes","tag-bug","tag-c","tag-c0x","tag-stl","tag-vs-2010"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=666"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/666\/revisions"}],"predecessor-version":[{"id":673,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/666\/revisions\/673"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=666"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}