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

Зачем Разве C ++ не позволяет создавать контейнеры неполных типов?

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

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

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

14

Решение

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

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

Насколько я понимаю, комитет не хотел лишать законной силы существующие реализации библиотеки, требуя от них обратной поддержки неполных типов.

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

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

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

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]