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