Я только что специализировался на std::hash
для пользовательского типа, используя:
template<>
struct hash<...> {...};
Когда VC10 приветствовал меня предупреждением:
warning C4099: 'std:: hash < _Kty > ': имя типа, впервые увиденное с использованием 'class' теперь видно, используя 'struct'
и я узнал, что его стандартная библиотека объявляет std::hash
как class
, тогда как в стандарте (или в последнем свободном черновом ящике) объявляется его как struct
.
Ну, конечно, я знаю, что структура не отличается от класса (за исключением разных типов доступа по умолчанию и типов наследования). Но мои вопросы:
- Нарушает ли стандарт VC10 стандарт или не может обменять
struct
наclass
на любые стандартные компоненты библиотеки (если, конечно, требуемые типы доступа для членов остаются неизменными)? - Является ли законным специализировать класс шаблона как структуру и наоборот, или это создает проблемы с разрешением имен и т.п. (по крайней мере, VC10 считает, что стоит предупредить).