c++ - std::atomic<X>::value_type 发生了什么?

标签 c++ c++11 gcc clang

根据 this reference manual

For every std::atomic<X> (whether or not specialized), std::atomic<X>::value_type is X.

但是如果我尝试使用这种类型,我会得到一个编译错误。

我用 g++ 8.2.1 试过了:

$ g++ -std=c++11 test.cc 
test.cc: In function ‘int main()’:
test.cc:6:23: error: ‘value_type’ is not a member of ‘std::atomic<int>’
     std::atomic<int>::value_type x = 0;

还有 clang 6.0.1

$ clang -std=c++11 test.cc 
test.cc:6:23: error: no type named 'value_type' in 'std::atomic<int>'
    std::atomic<int>::value_type x = 0;
~~~~~~~~~~~~~~~~~~^

前面提到的引用手册还明确指出...

specification was substantially rewritten to resolve numerous issues in particular, member typedefs value_type and difference_type are added

P0558R1然而,规范似乎并不禁止 value_type 的存在。 .

知道发生了什么吗?

编辑

我的一位同事让我意识到 P0558R1 只是一个提案

最佳答案

您正在明确使用 C++11。如果我们查看 last draft 的第 1119 页在 C++11 标准中,没有提及 std::atomicvalue_type:

template <class T> struct atomic {
    bool is_lock_free() const volatile;
    bool is_lock_free() const;
    void store(T, memory_order = memory_order_seq_cst) volatile;
    void store(T, memory_order = memory_order_seq_cst);
    T load(memory_order = memory_order_seq_cst) const volatile;
    T load(memory_order = memory_order_seq_cst) const;
    operator T() const volatile;
    operator T() const;
    T exchange(T, memory_order = memory_order_seq_cst) volatile;
    T exchange(T, memory_order = memory_order_seq_cst);
    bool compare_exchange_weak(T&, T, memory_order, memory_order) volatile;
    bool compare_exchange_weak(T&, T, memory_order, memory_order);
    bool compare_exchange_strong(T&, T, memory_order, memory_order) volatile;
    bool compare_exchange_strong(T&, T, memory_order, memory_order);
    bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst) volatile;
    bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst);
    bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst) volatile;
    bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst);

    atomic() = default;
    constexpr atomic(T);
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    T operator=(T) volatile;
    T operator=(T);
};

它在 C++14 草案中同样不存在。

cppreference 未能为 value_type 提及“自 C++17 起”。

编辑:有人指出,value_type 的添加是以缺陷报告的形式出现的,应该追溯应用于 C++11 的实现。因此,cppreference 实际上并没有错,DR 只是尚未在给定的编译器版本中实现。

关于c++ - std::atomic<X>::value_type 发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648614/

相关文章:

c++ - Hook OutputDebugStringA 引发异常

c++ - 使用 unordered_map 将对象映射为键

c++ - 从 vector 访问时,我的可变类的属性没有改变。 (调试)

macos - Clang OS X Lion,找不到 cstdint

linux - 链接没有soname,链接器名称的第3方共享库

c++ - 我可以对(非成员)函数使用部分模板特化吗?

c++ - 初始化 int 影响函数返回值

c++ - 遍历类模板的显式特化

c - 用于大小分析的 GCC 工具?

c++ - 是否有解决方法来解决 C++ 中智能指针对指针算术的限制?