decltype & '...' is private



  • class A {
    private:
        long_type member;
    };
    
    class B {
    private:
        decltype(A::member)::type member;
    };
    

    ergibt:

    error: 'long_type A::member' is private

    Sollte das nicht egal sein? Ich finde das unsinnig das zu verbieten (?).



  • Tim06TR schrieb:

    Sollte das nicht egal sein? Ich finde das unsinnig das zu verbieten (?).

    Dann tu es doch nicht. Du warst es, der A::member privat gemacht hat.



  • Ich will dass die Variable von außen hin nicht sichtbar ist, aber den Variablentyp für decltype unnutzbar zu machen ist doch sinnlos.

    und eine Template daraus zu machen ist übertrieben.
    Ich tippe auf einen Designfehler, trotzdem bleibt meine Kritik: Zugriffspezifizierer sollten darauf keinen Einfluss haben.
    In wie fern gibt mir das nun mehr Kapselung?



  • Tim06TR schrieb:

    Ich will dass die Variable von außen hin nicht sichtbar ist, aber den Variablentyp für decltype unnutzbar zu machen ist doch sinnlos.

    Dir ist klar, dass Memberobjekte nach außen hin einfach gar nicht existieren sollen, oder? Dass es dann irgendwie doch da ist macht überhaupt keinen Sinn.

    Ich tippe auf einen Designfehler

    Das ist kein Designfehler.

    , trotzdem bleibt meine Kritik: Zugriffspezifizierer sollten darauf keinen Einfluss haben.

    Und jeder hier im Forum sagt dir: Blödsinn.

    In wie fern gibt mir das nun mehr Kapselung?

    Indem der User deine Implementierung nicht kennt.

    Mach doch um himmelswillen einfach ein typedef.

    class A {
    private:
        long_type member;
    public:
    
        using value_type = long_type;
    };
    


  • Tim06TR schrieb:

    Ich will dass die Variable von außen hin nicht sichtbar ist, aber den Variablentyp für decltype unnutzbar zu machen ist doch sinnlos.

    Das ist ein Widerspruch. Die Variable kann nicht gleichzeitig sichtbar und nicht sichtbar sein.



  • Tim06TR schrieb:

    Ich tippe auf einen Designfehler, trotzdem bleibt meine Kritik: Zugriffspezifizierer sollten darauf keinen Einfluss haben.

    Die "Zugriffspezifizierer" beschränken in C++ ja nicht den Zugriff, sondern ob du das Ding von Ausserhalb "benennen" darfst.
    Und dann ist es nur konsequent dass hier für decltype keine Ausnahme gemacht wird. Denn um decltype zu machen müsstest du das Ding ja auch erstmal benennen.

    Und natürlich bricht es die Kapselung. Und zwar so:

    class foo
    {
    private:
        class very_very_private_helper { ... };
    
        very_very_private_helper m_helper;
    }
    
    void very_bad_function(foo& f)
    {
        decltype(foo::m_helper) h;  // <------ das sollten wir nicht können
        h.do_very_private_stuff(f); //         und das schon gar nicht
    }
    

    Wenn du jetzt meinst dass das sowieso nicht ginge, weil very_very_private_helper ja private ist, und daher sowieso nicht ausserhalb von foo verwendet werden kann, dann hier nochmal der Hinweis: es ist nur verboten private Dinge von ausserhalb zu benennen, nicht sie zu verwenden!

    Siehe hier:
    http://ideone.com/TK0wQL



  • EDIT: Danke für das Beispiel. Das leuchtet ein.


Log in to reply