Подтвердить что ты не робот

Почему контейнеры С++ не допускают неполные типы?

Почему С++ не позволяет создавать экземпляры неполных типов?

Конечно, можно писать контейнеры, которые не имеют этого ограничения - boost:: container вполне способен это сделать. Насколько я вижу, он, похоже, не дает какого-либо повышения производительности или другого типа, но стандарт объявляет его undefined.

Это предотвращает, например, создание рекурсивных структур данных.

Почему же тогда стандарт С++ налагает это произвольное ограничение? Что было бы недостатком в том, чтобы разрешать неполные типы в качестве параметров шаблона, где это возможно?

4b9b3361

Ответ 1

Мэтт Аустерн, председатель рабочей группы библиотеки комитетов по стандартизации C++, объяснил это решение комитета в своем д-р. Статьи Добба по историческим причинам:

Мы обнаружили, что с большим количеством тестов, что даже [простой] пример не работал с каждой реализацией STL. В конце концов, все это казалось слишком мутным и слишком плохо понимаемым; комитет по стандартизации не думал, что есть какой-либо выбор, кроме как сказать, что контейнеры STL не должны работать с неполными типами. Для хорошей меры мы применили этот запрет и для остальных стандартных библиотек.

Мое понимание этого состоит в том, что комитет не хотел аннулировать существующие реализации библиотеки, требуя, чтобы они поддерживали неполные типы ретроактивно.

В той же статье он признает, что

В будущей версии С++ может иметь смысл ослабить ограничение на создание стандартных шаблонов библиотеки с неполными типами.

Учитывая, что статья датируется 2002 годом, и запрет остается в действующем стандарте, я считаю, что решение разработчиков-разработчиков не ждать будущего и строить свои собственные контейнеры, которые допускают неполные типы, было полностью оправдано.