Во-первых, вот ответ на 2. взят из 14.5.1 [temp.class] параграф 4:
При повторном объявлении, частичной специализации, явной специализации или явном создании экземпляра шаблона класса ключ класса должен согласовываться в натуральной форме с исходным объявлением шаблона класса.
Однако struct
и class
ссылаются на один и тот же ключ класса в соответствии с 7.1.6.3 [dcl.type.elab] пункта 3 последнего предложения:
Ключевое слово class-key или enum, присутствующее в подробном спецификаторе типа, должно в натуре согласовываться с объявлением, на которое ссылается имя в подробном спецификаторе типа. [...] Таким образом, в любом разработанном спецификаторе типа ключевое слово enum должно использоваться для ссылки на перечисление, ключ класса объединения должен использоваться для ссылки на объединение, а также ключ класса или структуры class-key должен использоваться для ссылки на класс, объявленный с использованием class или struct class-key.
Пробуя g ++, clang и EDG, все соглашаются, что можно специализировать шаблон, объявленный как struct
как class
. Однако clang предупреждает об изменении с struct
на class
или наоборот. Исходя из этого, стандартная библиотека может свободно выбирать любое ключевое слово, которое она считает подходящим для определения. Очевидно, что если компилятор отклоняет код в результате, что-то серьезно нарушается, но я думаю, что в данном случае это не библиотека, а компилятор.