Почему нет заголовка <stlfwd>и можно ли считать его отсутствие дефектом? - PullRequest
10 голосов
/ 11 июня 2011

Стандартная библиотека содержит заголовок <iosfwd>, который (forward) объявляет все потоки, включая любые typedef s, и определяет шаблон char_traits, включая специализации.

К сожалению, такого нетЗаголовок <stlfwd>, который (вперед) объявляет все распространенные типы данных STL и функции, такие как vector, map, less, sort и т. Д. Еще более печально, что пользовательский код не может добавлять такие объявления / typedef s к пространству имен std, согласно

§17.4.3.1 [lib.reserved.names] p1:

Для программы на C + + не определено добавление объявлений илиопределения для пространства имен std или пространств имен в пространстве имен std, если не указано иное.Программа может добавить специализации шаблона для любого шаблона стандартной библиотеки в пространство имен std.

Yep, что охватывает случай (прямых) объявлений, даже если типы уже существуют в стандартной библиотеке.Конечно, большинство (все?) Компиляторов будут вести себя совершенно нормально, даже если добавить такие декларации, но строго говоря, если говорить языком, это неопределенное поведение.Я нахожу это особенно утомительным для typedef стандартных контейнеров, таких как:

// how to forward declare map and string?

typedef std::map<std::string, std::string> Attributes;

Теперь, это можно считать дефектом?

Я имею в виду как несуществование <stlfwd> заголовок (или лучше <stdfwd>, включая <iosfwd>) и запрет на объявления, уже существующие в стандартной библиотеке.

Кроме того, согласно этого вопроса , если один (вперед) объявляет стандартный контейнер, алгоритмы и функторы / функционалы в точности так, как того требует стандарт, код должен быть совершенно корректным (если онне для запрета пользовательских объявлений в пространстве имен std), потому что реализациям не разрешается добавлять какие-либо скрытые / заданные по умолчанию параметры шаблона.

Я спрашиваю об этом, потому что думаю ов конечном итоге представить сообщение об ошибке по этому вопросу.

1 Ответ

7 голосов
/ 11 июня 2011

С какой целью можно было бы объявить форвард, скажем less или sort, или вообще какой-нибудь другой алгоритм?Если вы передаете алгоритм общего назначения, он почти наверняка будет типом шаблона и вообще не нуждается в предварительном объявлении.

Это оставляет нам типы контейнеров.Определенно есть случаи, когда предварительные объявления о них были бы полезны, но я подозреваю, что было просто решено, что, поскольку каждое определение контейнера является относительно простым (по сравнению с iostreams), было бы предпочтительнее использовать полное включение, а не включениенапример.

...