Почему нет заголовка , и может ли его быть дефектом, не существующий его дефект?

StackOverflow https://stackoverflow.com/questions/6313771

Вопрос

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

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

§17.4.3.1 [lib.reserved.names] p1:

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

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

// how to forward declare map and string?

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

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

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top