Почему определения типа std :: atomic_ {char, schar и т. Д.} Могут быть typedefs для базового класса std :: atomic & lt; T & gt; а не atomic & lt; T & gt; только?

C ++ 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 относятся именно к специализациям, а не к базовым классам.

10

Решение

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

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

В этот заявлено, что

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector