{"id":2728,"date":"2017-02-27T11:11:20","date_gmt":"2017-02-27T10:11:20","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=2728"},"modified":"2017-02-27T11:11:20","modified_gmt":"2017-02-27T10:11:20","slug":"c-guns-auto-variables-gute-beispiele","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=2728","title":{"rendered":"C++ Guns - Auto Variables - Gute Beispiele"},"content":{"rendered":"<p>GotW 93 von Herb Sutter finde ich sehr gut. Es wird eine Reihe von M\u00f6glichkeiten f\u00fcr \"auto\" anhand von Beispielen gezeigt und erl\u00e4utert. Das erleichtert das Programmieren wirklich sehr. Schon 1983 wurde \"auto\" von Bjarne Stroustrup in C++ implementiert. Aber dank dem schon damals schrottigem C musste er es wieder raus nehmen. Na, ich bin sehr froh post C++11 zu leben.<\/p>\n<p><a href=\"https:\/\/herbsutter.com\/2013\/06\/13\/gotw-93-solution-auto-variables-part-2\/\">GotW 93<\/a><\/p>\n<p>Es gibt auch eine Situation, in welche \"auto\" auf den ersten Blick ein falschen Typ ableitet. Aber bei genauerer Betrachtung ist es das alte Problem von unterschiedlichen integer Typen. Also unsigned long int + signed int = unsigned long int. Der unsigned long int Datentyp ist \"st\u00e4rker\" als signed int. Diese Definition geht auf die Anf\u00e4ngen von C zur\u00fcck. Und es gibt keine L\u00f6sung die alle F\u00e4lle abdeckt. Es k\u00f6nnen weder signed Werte in unsigned long dargestellt werden, noch passen unsignled long in signed int rein. Aber jedesmal auf under\/overflow zu pr\u00fcfen ist einfach nicht effizient genug. Auch \"auto\" wird dieses Problem nicht l\u00f6sen. Aber es eliminiert die Folgefehler.<\/p>\n<p>Wie erw\u00e4hnt, ist der Ergebnistyp bei der Subtraktion von unsigned long und signed int wieder ein unsigned long, obwohl der Programmierer ein signed int als Ergebnis haben wollte. Ohne die Benutzung von \"auto\" ist das auch einfach zu erreichen. Aber es ist nicht ersichtlich, dass im Code ein versteckter Fehler lauert:<\/p>\n<pre><code>\r\nunsigned long x    = 42;\r\nsigned short  y    = 43;\r\nint diff = x - y;\r\n<\/code><\/pre>\n<p>Also das ist das reinste Kudelmuddel. unsigned long und signed short gehn rein, und signed int kommt raus. Jetzt kann das Ergebnis wegen unsigned long aber gr\u00f6\u00dfer sein, als ein int speichern kann. Und mit der Benutzung von \"auto\" ist der Ergebnistyp wieder unsigned long und kann damit keine negativen Werte speichen, obwohl das offensichtlich gewollt ist. <\/p>\n<p>Als Ergebnistyp w\u00fcrde signed long am besten passen. Aber erkl\u00e4r das mal den Programmierer, und dokumentiere diesen Pitfall an 1000 Stellen im Code, so dass es auch in 30 Jahren noch nachvollziehbar ist: no way!<br \/>\nAndrei Alexandrescu Idee finde ich hier sehr sch\u00f6n. Wir lassen nat\u00fcrlich den Compiler die Arbeit f\u00fcr uns machen! Der Compiler hat schon die Information, dass der Ergebnistyp ein long sein muss. Das ein signed Typ gewollt ist, sagt der Programmieren. In Kombination mit C++11 std::make_signed, welches f\u00fcr jeden gegebenen integral Typ, einen signed integral Typ ausspuckt, lassen sich sch\u00f6n zwei Hilfsfunktionen erstellen.<\/p>\n<pre><code>\r\n\/\/ C++14 version, option 1\r\ntemplate<class T> auto as_signed  (T t){ return make_signed_t  <T>(t); }\r\ntemplate<class T> auto as_unsigned(T t){ return make_unsigned_t<T>(t); }\r\n\r\nauto diff = as_signed(x - y);\r\n<\/code><\/pre>\n<p>Durch diesen Einzeiler wird der bestm\u00f6gliche Typ abgeleitet und gleichzeitig spricht der Code, dass hier was besonderes mit der Arithmetik passiert.<\/p>\n<p>\/\/\/ \\todo Beispiel Code der zeigt was mit const und referenzen passiert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GotW 93 von Herb Sutter finde ich sehr gut. Es wird eine Reihe von M\u00f6glichkeiten f\u00fcr \"auto\" anhand von Beispielen gezeigt und erl\u00e4utert. Das erleichtert das Programmieren wirklich sehr. Schon 1983 wurde \"auto\" von Bjarne Stroustrup in C++ implementiert. Aber dank dem schon damals schrottigem C musste er es wieder raus nehmen. Na, ich bin [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-2728","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2728"}],"version-history":[{"count":3,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2728\/revisions"}],"predecessor-version":[{"id":2731,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2728\/revisions\/2731"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2728"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}