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

时间:2018-12-06 09:52:27

标签: c++ c++11 gcc clang

根据this reference manual

  

对于每个std :: atomic(无论是否专用),std :: atomic :: 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;
~~~~~~~~~~~~~~~~~~^

上述参考手册还指定了...

  

规格被大幅改写以解决众多问题   特别是添加了成员​​typedefs value_type和difference_type

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

知道发生了什么吗?

编辑

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

2 个答案:

答案 0 :(得分:7)

您正在明确使用C ++ 11。如果我们看一下C ++ 11标准的last draft的第1119页,就没有提到value_type的{​​{1}}:

std::atomic

C ++ 14草案中也没有类似的内容。

cppreference只是没有提到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 ++ 17起”。

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

答案 1 :(得分:4)

鉴于P0558R1的性质,我希望它最终可以在先前的标准模式下作为事实上的缺陷报告进行追溯实施,并以此进行记录。本文对依赖于这些typedef的非成员函数模板进行了主要的手术。实施者通常会追溯应用类似的手术。作为数据点,已知的唯一完全实现了P0558R1(MSVC)的主要实现方式都是如此,而与语言版本无关。

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