为什么std :: atomic_ {char,schar等} typedef允许typedef为std :: atomic <T>的基类,而不仅仅是atomic <T>?

10

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

应有对应于atomic的整数特化的命名类型,如表145所指定,并且有一个名为atomic_bool的命名类型,对应于指定的atomic<bool>。每个命名类型都是相应专业化的typedef或相应专业化的基类。如果它是基类,则应支持与相应专业化相同的成员函数。

(已加重)

std::atomic_char等类型不与std::atomic<char>完全相同的理由是什么?这能提供什么灵活性,为什么有用?乍一看,我不明白为什么这些不需要直接成为std::atomic<T>专业化的typedef。

请注意,建议<atomic>N2427说,typedef必须完全专门化,而不能可能成为基类。

1个回答

2

可能是因为有人已经使用了 std::atomic_* 类型作为基类实现原子性,并且对这种方法提出了足够多的抱怨/提出了好的理由。

在MSVC中建议使用这种实现方式。

这篇文章指出:

取消 atomic_.... 命名类型与 atomic 模板类特化之间的定义基类关系。基类关系现在取决于具体实现。这个更改确保与 C 的兼容性。一些以前从基类继承的成员函数和运算符必须从命名类型移到特化中。


C 兼容性参数在这里看起来是胜利者。有点伤心,但可以理解。(但这并不像这对于大多数代码都很重要,因为它只能在诸如std::is_same和有时在重载和模板参数推断上下文中观察到。所以这不是太大的问题。) - Jeff Walden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接