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!