Heim >Backend-Entwicklung >C++ >Warum funktioniert „auto' mit privaten Typen, während die explizite Deklaration fehlschlägt?

Warum funktioniert „auto' mit privaten Typen, während die explizite Deklaration fehlschlägt?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-16 00:57:09655Durchsuche

Why Does 'auto' Work with Private Types While Explicit Declaration Fails?

Verwendung von „auto“ für private Typen: Barrierefreiheit enthüllt

Bei der Arbeit mit privaten Typen innerhalb einer Klasse kann es zu einer merkwürdigen Situation kommen: Beim Versuch, a explizit zu deklarieren Variable, die den Typnamen verwendet, führt zu einem Fehler. Die Verwendung von „auto“ zum Ableiten des Typs scheint nahtlos zu funktionieren.

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};

Im gegebenen Fall Code, Foo enthält einen privaten verschachtelten Typ Bar. Die Ausführung der folgenden Zeile löst einen Fehler aus:

Foo::Bar b = f.Baz();  // error

Unerwartet wird das Problem durch die Verwendung von „auto“ behoben:

auto b = f.Baz();         // ok

Warum ist das zulässig?

Sowohl die „automatische“ Typableitung als auch die Vorlagentyp-Inferenz haben einen ähnlichen zugrunde liegenden Mechanismus. In diesem Fall ähnelt es der Funktionsweise von „Vorlagen“-Funktionen mit privaten Typen:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

Enthüllung der Barrierefreiheit

Die Möglichkeit, Objekte privater Typen an zu übergeben Vorlagenfunktionen verwenden oder „auto“ verwenden, um auf ihren Typ zu schließen, ergibt sich aus der Tatsache, dass der Typ selbst zugänglich bleibt, auch wenn sein Name verborgen ist. Der Compiler entwirrt durch Typableitung die Struktur des Objekts und ermöglicht so seine Nutzung.

Daher ist der Name eines privaten Typs zwar nicht zugänglich, seine Typinformationen sind jedoch weiterhin verfügbar, was eine Manipulation durch Mechanismen wie „auto“ ermöglicht ' oder Vorlagenabzug.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „auto' mit privaten Typen, während die explizite Deklaration fehlschlägt?. 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