C++Guns – RoboBlog

01.01.2019

C++ Guns: You can use auto on a private type!

Filed under: Allgemein — Tags: — Thomas @ 19:01

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 überraschend, aber wenn man bedenkt, dass die Zugriffsregeln nur für Namen gelten, ist alles wieder konsistent. Den Namen einer Privaten Klasse darf nicht genutzt werden, aber der Typ schon. Daher funktioniert hier auto, da kein Name explizit hingeschrieben werden muss.

Selbe Argumentation gibt auch für Templates oder temporäre Objekte. Da auch hier das Symbol inner nicht außerhalb der Klasse A auftaucht.

A a;
a.func2(a.func());

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress