【问题标题】:Why are the std::atomic_{char,schar,etc.} typedefs allowed to be typedefs to a base class of std::atomic<T>, and not to atomic<T> only?为什么 std::atomic_{char,schar,etc.} 类型定义允许作为 std::atomic<T> 基类的类型定义,而不是仅作为 atomic<T> 的类型定义?
【发布时间】:2013-05-07 16:08:30
【问题描述】:

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

应有与atomic 的整数特化相对应的命名类型,如表145 中指定的,以及与指定的atomic&lt;bool&gt; 相对应的命名类型atomic_bool。每个命名类型要么是对应特化的typedef,要么是对应特化的基类。如果是基类,则应支持与相应特化相同的成员函数。

(强调)

std::atomic_charstd::atomic&lt;char&gt; 不同的基本原理是什么,等等所有其他类型?这能带来什么灵活性,为什么有用?乍一看,我不明白为什么不需要直接将这些类型定义为std::atomic&lt;T&gt; 专业化。

请注意,N2427 提议 &lt;atomic&gt; 表示 typedef 完全针对特化,而不可能针对基类。

【问题讨论】:

    标签: c++ c++11 stl atomic c++-standard-library


    【解决方案1】:

    可能是因为有人已经使用std::atomic_* 类型作为基类实现了原子,并且对此方法提出了足够的抱怨/提供了一个很好的论据。

    MSVC 中建议了这样的实现。

    this 中声明

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

    【讨论】:

    • C 兼容性参数看起来像这里的赢家。悲伤,有点,但可以理解。 (但对于很多代码来说,这并不重要,因为它大多只能在 std::is_same 之类的东西中观察到,有时在重载和模板参数推导上下文中。所以这没什么大不了的。)
    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2014-07-02
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多