{"id":3894,"date":"2019-01-01T19:28:31","date_gmt":"2019-01-01T18:28:31","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3894"},"modified":"2019-01-01T19:28:31","modified_gmt":"2019-01-01T18:28:31","slug":"c-guns-you-can-use-auto-on-a-private-type","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3894","title":{"rendered":"C++ Guns: You can use auto on a private type!"},"content":{"rendered":"<p>See<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/13532784\/why-can-i-use-auto-on-a-private-type\">https:\/\/stackoverflow.com\/questions\/13532784\/why-can-i-use-auto-on-a-private-type<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/31185119\/preventing-return-of-private-inner-class-instance\">https:\/\/stackoverflow.com\/questions\/31185119\/preventing-return-of-private-inner-class-instance<\/a><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct A {\r\nprivate:\r\n    struct inner {\r\n    };\r\n\r\npublic:\r\n  inner func() { }\r\n  void func2(inner) {}\r\n};\r\n\r\nauto func() {\r\n    A a;    \r\n    auto x = a.func();\r\n    decltype(x) y;\r\n    a.func2(y);\r\n\r\n    A::inner z; \/\/ Not ok\r\n}\r\n<\/pre>\n<p>Auf den ersten Blick etwas \u00fcberraschend, aber wenn man bedenkt, dass die Zugriffsregeln nur f\u00fcr <b>Namen<\/b> gelten, ist alles wieder konsistent. Den Namen einer Privaten Klasse darf nicht genutzt werden, aber der Typ schon. Daher funktioniert hier <i>auto<\/i>, da kein Name explizit hingeschrieben werden muss.<\/p>\n<p>Selbe Argumentation gibt auch f\u00fcr Templates oder tempor\u00e4re Objekte. Da auch hier das Symbol <i>inner<\/i> nicht au\u00dferhalb der Klasse <i>A<\/i> auftaucht.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nA a;\r\na.func2(a.func());\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>See https:\/\/stackoverflow.com\/questions\/13532784\/why-can-i-use-auto-on-a-private-type https:\/\/stackoverflow.com\/questions\/31185119\/preventing-return-of-private-inner-class-instance struct A { private: struct inner { }; public: inner func() { } void func2(inner) {} }; auto func() { A a; auto x = a.func(); decltype(x) y; a.func2(y); A::inner z; \/\/ Not ok } Auf den ersten Blick etwas \u00fcberraschend, aber wenn man bedenkt, dass die Zugriffsregeln nur f\u00fcr Namen gelten, [&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-3894","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\/3894","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=3894"}],"version-history":[{"count":9,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3894\/revisions"}],"predecessor-version":[{"id":3903,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3894\/revisions\/3903"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3894"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}