2017-02-21 2 views
12

Ich beobachtete one of Jason Turner's videos und ich sah, dass Sie einen Typ innerhalb eines Funktionsbereichs definieren können und außerhalb dieses Bereichs durch Funktion Rückgabetypabzug verfügbar haben.Warum kann ich auf eine Struktur zugreifen, die innerhalb einer Funktion außerhalb der Funktion durch Rückgabetypableitung definiert ist?

auto f() 
{ 
    struct MyStruct 
    { 
     int n; 
    }; 
    return MyStruct{}; 
} 

int main() 
{ 
    auto a = f().n; 
    return a; 
} 

Warum ist das erlaubt? Gibt es einen Absatz in der C++ 14-Norm, der dies erlaubt?

Beim Versuch, die typeid von MyStruct mit Klappern in compile explorer ich in der Montage Ausgabe angezeigt die Art, wie f()::MyStruct sah zu bekommen, so gibt es einen Spielraum, aber irgendwie kann ich MyStruct außerhalb dieses Bereichs zuzugreifen. Ist das eine Art von ADL-Sache?

+5

Der Name einen Umfang hat, nicht der Typ. Sie verwenden den Namen nicht außerhalb seines Gültigkeitsbereichs. –

+3

Es gibt ein Duplikat ... irgendwo. Aber hey, dieser sieht gut aus. – Quentin

+0

Etwas wie [das] (http://stackoverflow.com/questions/13532784/why-cani-i-use-auto-on-a-private-type)? – smkanadl

Antwort

13

Nein, es gibt keine ADL. Da Ihre Übersetzungseinheit die Definition der Struktur enthält, ist der Zugriff auf die Mitglieder problemlos möglich.

Der wichtige Punkt ist, dass Typen wirklich nicht in Bereichen bestehen: Namen tun. Und beachten Sie, dass Sie die Kennung MyStruct anstelle von auto bei der Deklaration a nicht verwenden können. Der Name ist so unzugänglich wie es sein sollte. Solange Sie jedoch auf den Typ zugreifen können, ohne den unzugänglichen Namen zu verwenden, ist alles in Ordnung.

Im Prinzip ist dies kaum anders als mit einem private Elementtyp:

class X 
{ 
    struct Hidden 
    { 
    int i; 
    }; 

public: 
    Hidden get() const { return {42}; } 
}; 

int main() 
{ 
    X x; 
    auto h = x.get(); 
    assert(h.i == 42); 
} 
+0

Vielen Dank für die Klärung des Unterschieds zwischen dem Typnamen und dem tatsächlichen Typ für mich ^^. – bluespeck

Verwandte Themen