代码之家  ›  专栏  ›  技术社区  ›  Dacav

std::atomic<X>::value\u type发生了什么?

  •  8
  • Dacav  · 技术社区  · 6 年前

    根据 this reference manual

    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 -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;
    ~~~~~~~~~~~~~~~~~~^
    

    上述参考手册还规定。。。

    特别是,添加了成员typedefs value\u type和difference\u type

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

    知道发生了什么吗?

    编辑

    我的一位同事让我意识到P0558R1只是一个 建议 .

    2 回复  |  直到 4 年前
        1
  •  8
  •   Max Langhof    6 年前

    您正在显式地使用C++11。如果我们看一下第1119页 last draft 在C++11标准中,没有提到 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只是没有提到“因为C++17” 值类型

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

        2
  •  4
  •   T.C. Yksisarvinen    6 年前

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

    CPPYPE的目标是假设每个C++标准的完整和正确的实现,以及适用于该标准的所有缺陷报告和澄清。