Стандартная библиотека включает заголовок <iosfwd>
, который (вперед) объявляет все потоки, включая любые typedef
, и определяет шаблон char_traits
, включая специализации.
К сожалению, нет такого заголовка <stlfwd>
, который (вперед) объявляет все распространенные типы данных и функции STL, такие как vector
, map
, less
, sort
и т. д. Что еще более печально, пользовательский код не может добавлять такие объявления / typedef
в пространство имен std
. , согласно
§17.4.3.1 [lib.reserved.names] p1
:
Для программы C++ не определено добавлять объявления или определения в пространство имен
std
или пространства имен в пределах пространства именstd
, если не указано иное. Программа может добавлять специализации шаблонов для любого шаблона стандартной библиотеки в пространство именstd
.
Да, это охватывает случай (прямых) объявлений, даже если типы уже существуют в стандартной библиотеке. Конечно, большинство (все?) компиляторов будут вести себя совершенно нормально, даже если добавить такие объявления, но, строго говоря, с точки зрения юриста, это поведение undefined. Я нахожу это особенно утомительным для typedef
ing стандартных контейнеров, таких как:
// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;
Теперь можно ли это считать недостатком?
Я имею в виду как отсутствие заголовка <stlfwd>
(а лучше <stdfwd>
, перекрывающего и <iosfwd>
), так и запрет на уже существующие в стандартной библиотеке объявления.
Кроме того, в соответствии с этот вопрос, если один (вперед) объявляет стандартный контейнер, алгоритмы и функторы/функционалы именно так, как того требует стандарт, код должен быть полностью валидным (если бы не запрет пользовательских объявлений в пространстве имен std
), потому что реализациям не разрешено добавить любые скрытые/по умолчанию параметры шаблона.
Я спрашиваю об этом, потому что думаю о том, чтобы в конечном итоге отправить отчет о дефекте по этому поводу.