2016-07-20 11 views
5
struct some_struct 
{ 
    std::list<some_struct> nested; 
}; 

IIUC in der Vergangenheit würde dies UB aufrufen, da die Standardcontainer nur mit vollständigen Typen instanziiert werden müssen.Kann ich den Iterator einer Liste eines unvollständigen Typs verwenden?

Nun aber haben wir von diesen Fortschritte gemacht und per http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html können wir std::list, std::forward_list und std::vector mit unvollständigen Typen instanziiert, so dass der obige Code gültig ist.

Aber, aber, ich kann noch weiter gehen ein wenig und schreiben:

struct some_struct 
{ 
    std::list<some_struct>::iterator it; 
}; 

?

Instanziieren eines Containers und Verwenden seiner Elementtypen ist nicht das gleiche ... Zum Beispiel wurde mir gesagt, dass ich Boost-Container mit unvollständigen Typen instanziieren kann, aber ich kann ihre nicht verwenden, wenn das Template-Argument ein vollständiger Typ ist . Ich bin mir also nicht sicher, ob das obige Code-Snippet gültig ist.

Ist es?

+1

Wirklich können Sie es tun (zumindest für * libC++ * und * libstdC++ *). Aber es ist nicht tragbar und nicht konform. – Orient

Antwort

8

Das ist sehr Papier sagt

T vollständig sein muss, bevor ein Mitglied der resultierenden Spezialisierung von list verwiesen wird.

+0

Alles klar, danke. Stellt sich heraus, ich war schlampig ... :( – gaazkam