C++ 为什么std::atomic_{char,schar,etc.}typedefs允许作为std::atomic的基类的typedefs<;T>;,而不是原子<;T>;只有

C++ 为什么std::atomic_{char,schar,etc.}typedefs允许作为std::atomic的基类的typedefs<;T>;,而不是原子<;T>;只有,c++,c++11,stl,atomic,c++-standard-library,C++,C++11,Stl,Atomic,C++ Standard Library,C++11[atomics.types.generic]第7页: 如表145所述,应具有与原子的整体专业化相对应的命名类型,以及与指定的原子的命名类型。每个命名类型要么是对应专门化的typedef,要么是对应专门化的基类。如果它是基类,它应该支持与相应的专门化相同的成员函数 (增加重点) 对于所有其他类型,让std::atomic_char与std::atomic不相同的理由是什么?这能带来什么样的灵活性,为什么它有用?乍一看,我不明白为什么不需要直接将这些类型定义为std::atomic专门化

C++11[atomics.types.generic]第7页:

如表145所述,应具有与
原子的整体专业化相对应的命名类型,以及与指定的
原子的命名类型。每个命名类型要么是对应专门化的typedef,要么是对应专门化的基类。如果它是基类,它应该支持与相应的专门化相同的成员函数

(增加重点)

对于所有其他类型,让
std::atomic_char
std::atomic
不相同的理由是什么?这能带来什么样的灵活性,为什么它有用?乍一看,我不明白为什么不需要直接将这些类型定义为
std::atomic
专门化


请注意,提议的
说typedef是专门化的,而不可能是基类。

这可能是因为有人已经实现了原子学,使用
std::atomic.*
类型作为基类,并对这种方法提出了足够的抱怨/提供了很好的论据

在这种情况下,建议实施

其中指出:

删除原子之间的定义基类关系。。。。命名类型和原子模板类的相应专门化。基类关系现在依赖于实现。此更改确保了与C的兼容性。以前从基类继承的某些成员函数和运算符必须从命名类型提升到专门化


C兼容性参数看起来是这里的赢家。有些悲伤,但可以理解。(但这对很多代码来说并不是很重要,因为只有在
std::is_same
这样的情况下,有时在重载和模板参数推断上下文中,才可以观察到这一点。所以这没什么大不了的。)