Почему нет заголовка и может ли его отсутствие считаться дефектом?

Стандартная библиотека включает заголовок , который (вперед) объявляет все потоки, включая любые 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 ), потому что реализациям не разрешено добавлять какие-либо скрытые / заданные по умолчанию параметры шаблона.

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

10
задан Community 23 May 2017 в 12:33
поделиться