Ответ 1
В разделе 17 Введение в библиотеку:
17.5.2.3 Частные члены [objects.within.classes]
1 - в пунктах с 18 по 30 и в приложении D не указывается представление классов и умышленно не указано спецификация членов класса. Реализация может определять статические или нестатические члены класса или и то, и другое по мере необходимости для реализации семантики функций-членов, указанных в пунктах с 18 по 30 и в приложении D.
Это поддерживается 1.4 Соответствие реализации [intro.compliance]:
3 - для классов и классов шаблонов в разделах библиотеки указаны частичные определения. Частные члены (раздел 11) не указаны, но каждая реализация должна предоставить их для завершения определений в соответствии с описанием в разделах библиотеки.
Реализация указанной семантики через наследование явно не обсуждается нигде в разделе 17, но она неявно разрешена в пункте 3 раздела 17.5.2.3 выше:
3 - Реализация может использовать любую технику, которая обеспечивает эквивалентное внешнее поведение.
Так, например, упорядоченные ассоциативные контейнеры node могут совместно использовать детали реализации (включая, в конечном счете, членов класса) через наследование.
Поскольку внешнее поведение tuple
изменяется между тем, что A
является членом класса и непосредственно наследует его, а так как это изменение поведения вызывает отказ от хорошо сформированных программ (в отличие от простое изменение sizeof
класса), libstdС++ нарушает Стандарт.