Разрешено ли реализациям стандартной библиотеки С++ добавлять общедоступные (и защищенные) элементы в интерфейсы стандартных типов? N3797 17.6.5.5 [member.functions]/2 говорит:
Реализация может объявлять дополнительные не виртуальные сигнатуры функций-членов внутри класса:
— путем добавления аргументов со значениями по умолчанию в сигнатуру функции-члена; [ Примечание. Реализация не может добавлять аргументы со значениями по умолчанию в виртуальные, глобальные или функции, не являющиеся членами. — конец примечания ]
— путем замены сигнатуры функции-члена со значениями по умолчанию на две или более сигнатуры функции-члена с эквивалентным поведением; и
— путем добавления подписи функции-члена для имени функции-члена.
Означает ли это, что стандартная библиотека ни при каких обстоятельствах (включая, например, зарезервированные идентификаторы) не может добавлять никаких дополнительных общедоступных членов с именами, не упомянутыми в стандарте?
Небольшое пояснение: это текст о добавлении сигнатур (который, я полагаю, говорит о новых сигнатурах только для функций, которые уже определены, так что никаких новых имен), который мне удалось найти в стандарт. Существует также сноска 189, в которой говорится:
Допустимая программа на C++ всегда вызывает ожидаемую функцию-член библиотеки или функцию с эквивалентным поведением. Реализация также может определять дополнительные функции-члены, которые в противном случае не вызывались бы допустимой программой на C++.
Весь этот текст взят из [member.functions], поэтому он явно касается только функций-членов. Мой вопрос более общий и требует ссылок, которые я мог пропустить: разрешена ли реализация стандартной библиотеки добавлять новые имена в общедоступные (и/или защищенные) интерфейсы стандартного типа, будь то данные или функциональные члены?
A valid C++ program always calls the expected library member function, or one with equivalent behavior. An implementation may also define additional member functions that would otherwise not be called by a valid C++ program.
- person Shafik Yaghmour   schedule 04.02.201417.6.5.11
Производные классы, вероятно, охватывают то, что вы ищете, это говоритAn implementation may derive any class in the C++ standard library from a class with a name reserved to the implementation.
и не накладывает никаких ограничений на эти базовые классы.gcc
использует это повсеместно, хотя большинство общедоступных элементов данных защищены в классе stl, используя что-то вродеusing _Base::_M_impl;
в защищенном разделе. - person Shafik Yaghmour   schedule 04.02.2014