2013-09-07 2 views
13

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

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

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

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

+8

Поскольку контейнеры, если они не хранят указатели, нуждаются в размере типа объекта, который он хранит? –

+1

Почему, по-вашему, они этого не делают? Я не могу найти такого ограничения в стандарте C++ 11. –

+2

@ViktorSehr: все стандартные контейнеры, кроме 'array' * do * (напрямую), хранят указатели, а не объекты; поэтому они не должны нуждаться в типе, который должен быть полным, пока не будет необходимо выделить один или несколько объектов. –

ответ

15

Мэтт Austern, председатель библиотечной рабочей группы C++ комитета по стандартизации, в мотивировал это решение комитета в Его Dr. Dobb's article по историческим причинам:

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

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

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

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

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

+1

Статья доктора Доббса довольно устарела. Boost реализовал его сейчас, и это, очевидно, возможно. Ваше последнее предложение имеет смысл, но статья доктора Доббса не ... – Mehrdad

+2

@ Мехридад Стандартные комитеты (как большинство комитетов) очень медленно принимают решения. Иногда это хорошо; иногда (как мне кажется, имеет место стандартная библиотека C++), это слишком ограничительно. Возраст этой статьи является хорошим доказательством: это ограничение должно было быть снято в течение длительного времени, по крайней мере, на 'std :: vector '. – dasblinkenlight

+1

Я, честно говоря, не думаю, что они были «медленными» ... и идея, что они не захотят требовать от библиотек поддержки этого ретроактивно, странно. В конце концов, это новый стандарт C++ - есть тонны гораздо более сложных изменений; В чем преимущество этого не добавляя? – Mehrdad

Смежные вопросы