¿Por qué los contenedores C ++ no permiten tipos incompletos?

¿ Por qué C ++ no permite crear instancias de contenedores de tipos incompletos?

Ciertamente es posible escribir contenedores que no tienen esta restricción: boost :: container es completamente capaz de hacer esto. Por lo que puedo ver, no parece dar ningún rendimiento u otro tipo de ganancia, y sin embargo, el estándar declara que es un comportamiento indefinido.

Evita que se construyan estructuras de datos recursivas, por ejemplo.

¿Por qué entonces el estándar de C ++ impone esta restricción arbitraria? ¿Cuál habría sido la desventaja de permitir tipos incompletos como parámetros de plantilla siempre que sea posible?

Matt Austern, el presidente del grupo de trabajo de la biblioteca del comité de normalización de C ++, explicó esta decisión del comité en su artículo del Dr. Dobb por razones históricas:

Descubrimos, con más pruebas, que incluso el ejemplo [simple] no funcionaba con cada implementación de STL. Al final, todo parecía demasiado turbio y muy poco entendido; el comité de normalización no pensó que hubiera otra opción, excepto para decir que los contenedores STL no deberían funcionar con tipos incompletos. Para una buena medida, aplicamos esa prohibición al rest de la biblioteca estándar también.

Mi comprensión de esto es que el comité no quiso invalidar las implementaciones existentes de la biblioteca al exigirles que respalden retroactivamente los tipos incompletos.

En el mismo artículo, admite que

En una futura revisión de C ++, podría tener sentido relajar la restricción al crear instancias de plantillas de biblioteca estándar con tipos incompletos.

Dado que el artículo se remonta a 2002, y la prohibición sigue vigente en el estándar actual, creo que la decisión del impulso de los diseñadores de no esperar al futuro y construir sus propios contenedores que permitan tipos incompletos estaba plenamente justificada.