Почему std:: atomic _ {char, schar и т.д.} Разрешено вводить typedefs в базовый класс std:: atomic <T>, а не только для атомного <T>?

С++ 11 [atomics.types.generic] p7:

Должны быть названы типы, соответствующие интегральным специализациям atomic, как указано в таблице 145, и именованный тип atomic_bool, соответствующий указанному atomic<bool>. Каждый именованный тип является либо typedef соответствующей специализации , либо базовым классом соответствующей специализации. Если это базовый класс, он должен поддерживать те же функции-члены, что и соответствующая специализация.

(выделено курсивом)

Какое обоснование допускать std::atomic_char не идентично std::atomic<char> и т.д. для всех других типов? Какую гибкость это дает, и почему это полезно? На первый взгляд, я не понимаю, почему это не требуется, чтобы быть typedefs для std::atomic<T> специализаций напрямую.

Обратите внимание, что N2427, который предложил <atomic>, говорит, что typedefs относятся к специализациям точно, а не к базовым классам.

Ответ 1

Вероятно, это потому, что у кого-то уже была реализация атомистики с использованием типов std::atomic_* в качестве базовых классов и достаточно жаловалась/дала хороший аргумент в пользу этого подхода.

В MSVC такая реализация предлагается.

В this указано, что

Удалите определенную связь базового класса между атомными именами типа и соответствующими специализациями класса атомарного шаблона. Отношения базового класса теперь зависят от реализации. Это изменение обеспечивает совместимость с C. Некоторые функции-члены и операторы, ранее унаследованные от базового класса, должны быть выведены из названных типов в специализации.