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

问题描述 投票:0回答:2

根据本参考手册

对于每个

std::atomic<X>
(无论是否专门化),
std::atomic<X>::value_type
都是 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;
~~~~~~~~~~~~~~~~~~^

上述参考手册还指出...

对规范进行了大幅重写以解决许多问题 特别是,添加了成员 typedef value_type 和 Difference_type

然而,P0558R1规范似乎并不禁止

value_type
的存在。

知道发生了什么事吗?

编辑

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

c++ c++11 gcc clang stdatomic
2个回答
9
投票

您明确使用 C++11。如果我们查看 C++11 标准的最后草案的第 1119 页,就会发现没有提及

value_type
来表示
std::atomic

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
的“Since C++17”。

编辑:有人指出,

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


5
投票

考虑到 P0558R1 的性质,我预计它最终会作为事实上的缺陷报告在以前的标准模式中追溯实施并记录下来。本文对依赖于这些 typedef 的存在的非成员函数模板进行了重大手术。类似的手术通常由实施者追溯实施。作为一个数据点,已知唯一完全实现 P0558R1 (MSVC) 的主要实现无论语言版本如何。

cppreference 的目标是假设完整且正确地实现每个 C++ 标准以及适用于该标准的所有缺陷报告和说明。

© www.soinside.com 2019 - 2024. All rights reserved.