Heim >Backend-Entwicklung >C++ >Warum kann „automatisch' auf private C-Typen zugegriffen werden, wenn der direkte Zugriff verboten ist?

Warum kann „automatisch' auf private C-Typen zugegriffen werden, wenn der direkte Zugriff verboten ist?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-16 06:31:11810Durchsuche

Why Can `auto` Access Private C   Types When Direct Access Is Forbidden?

Auto- und Privattypen: Das Rätsel um die Barrierefreiheit wird gelüftet

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn