Im Bereich C weckt die Vielseitigkeit von Auto oft Neugier und manchmal sogar Verwirrung. Eine verblüffende Beobachtung ergibt sich bei der Verwendung von „auto“ mit privaten Typen.
Bedenken Sie den folgenden Codeausschnitt, der überraschenderweise fehlerfrei kompiliert wird:
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
Dieses unkonventionelle Verhalten wirft die Frage auf: Warum können wir auf a zugreifen? privater Typ über Auto, während der direkte Zugriff verboten ist?
Um dieses Rätsel zu lösen, müssen wir uns mit der Mechanik von befassen auto. Seine Typableitungsregeln spiegeln weitgehend die von C-Vorlagen wider. Diese Beobachtung gilt für das oben genannte Codebeispiel. So wie wir Objekte privater Typen als Argumente an Vorlagenfunktionen übergeben können:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
wir können ihre Typen auch mit auto ableiten. Dies liegt daran, dass die Typinformationen weiterhin verfügbar sind, auch wenn der Typname selbst nicht zugänglich ist. Dies ermöglicht die Rückgabe privater Typen an den Clientcode und ermöglicht so den ansonsten verbotenen Zugriff über auto.
Das obige ist der detaillierte Inhalt vonWarum kann „automatisch' auf private C-Typen zugegriffen werden, wenn der direkte Zugriff verboten ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!