Warum erlauben C ++ – Container keine unvollständigen Typen?

Warum erlaubt C ++ nicht, dass Container unvollständiger Typen instanziiert werden?

Es ist sicherlich möglich , Container zu schreiben, die diese Einschränkung nicht haben – boost :: container ist dazu in der Lage. Soweit ich sehen kann, scheint es keine performance oder andere Art von Gewinn zu geben, und dennoch erklärt der Standard, dass es ein undefiniertes Verhalten ist.

Es verhindert beispielsweise, dass rekursive Datenstrukturen aufgebaut werden.

Warum erzwingt der C ++ – Standard diese willkürliche Einschränkung? Was wäre der Nachteil gewesen, unvollständige Typen als Vorlagenparameter zuzulassen, wo immer dies möglich war?

Matt Austern, der Vorsitzende der Bibliotheksarbeitsgruppe des C ++ – Standardisierungsausschusses, erläuterte diese Entscheidung des Ausschusses in seinem Artikel von Dr. Dobb aus historischen Gründen:

Wir haben mit mehr Tests festgestellt, dass selbst das [einfache] Beispiel nicht bei jeder STL-Implementierung funktioniert. Am Ende schien alles zu düster und zu schlecht zu verstehen; Das Normungsgremium hielt es nicht für möglich, zu sagen, dass STL-Container nicht mit unvollständigen Typen arbeiten sollten. Um das zu erreichen, haben wir dieses Verbot auch auf den Rest der Standardbibliothek angewendet.

Mein Verständnis davon ist, dass das Komitee nicht wollte, dass vorhandene Implementierungen der Bibliothek ungültig gemacht werden, indem man sie dazu auffordert, unvollständige Typen rückwirkend zu unterstützen.

Im selben Artikel räumt er das ein

In einer zukünftigen Überarbeitung von C ++ könnte es sinnvoll sein, die Einschränkung bei der Instanziierung von Standardbibliotheksvorlagen mit unvollständigen Typen zu lockern.

Da der Artikel aus dem Jahr 2002 stammt und das Verbot in der aktuellen Norm beibehalten wird, denke ich, dass die Entscheidung der Boostdesigner, nicht auf die Zukunft zu warten und ihre eigenen Container zu bauen, die unvollständige Typen zulassen, voll gerechtfertigt war.