Зачем Разве C ++ не позволяет создавать контейнеры неполных типов?
Это конечно возможный писать контейнеры, которые не имеют этого ограничения — повышение :: контейнер вполне способен сделать это. Насколько я могу судить, похоже, что он не дает какой-либо производительности или какого-либо другого усиления, однако стандарт объявляет его неопределенным поведением.
Это делает например, предотвратить построение рекурсивных структур данных.
Почему тогда стандарт C ++ накладывает это произвольное ограничение? Что было бы недостатком в том, чтобы разрешать неполные типы в качестве параметров шаблона везде, где это возможно?
Мэтт Аустерн, председатель библиотечной рабочей группы комитета по стандартизации C ++, объяснил это решение комитета в своем Статья доктора Добба по историческим причинам:
При более тщательном тестировании мы обнаружили, что даже [простой] пример не работает с каждой реализацией STL. В конце концов, все это казалось слишком темным и слишком плохо понятым; Комитет по стандартизации не думал, что был какой-либо выбор, кроме как сказать, что контейнеры STL не должны работать с неполными типами. В качестве меры предосторожности мы применили этот запрет и к остальной части стандартной библиотеки.
Насколько я понимаю, комитет не хотел лишать законной силы существующие реализации библиотеки, требуя от них обратной поддержки неполных типов.
В той же статье он признает, что
В будущих версиях C ++ может иметь смысл ослабить ограничение на создание экземпляров стандартных библиотечных шаблонов с неполными типами.
Учитывая, что статья датируется 2002 годом, и в действующем стандарте остается запрет, я думаю, что решение разработчиков надстроек не ждать будущего и создавать свои собственные контейнеры, которые допускают неполные типы, было полностью оправдано.
Других решений пока нет …