c ++ std :: atomic <bool> :: fetch_or没有实现?

时间:2015-05-15 08:08:36

标签: c++ embedded atomicity

使用以下代码摘录:

class myclass {
    volatile std::atomic<bool> flag;
    public:
    myclass(): flag(false) {}
    bool get_flag() { return flag; }
    bool try_set() {
        return !flag.fetch_or(flag, true);
    }
    void reset() {
        flag = false;
    }
};

我遇到了这个编译错误:

error: ‘volatile struct std::atomic<bool>’ has no member named ‘fetch_or’   
   return !flag.fetch_or(flag, true);

但是,如果我将模板参数更改为int

,则会编译
class myclass {
    volatile std::atomic<int> flag;
    public:
    myclass(): flag(0) {}
    bool get_flag() { return flag; }
    bool try_set() {
        return !flag.fetch_or(flag, true);
    }
    void reset() {
        flag = 0;
    }
};

atomic引用说“完全专业化atomic<bool>”被视为“非专业化”,我认为是问题的根源。所以我怀疑:

  1. 如何将“完全专业化”视为“非专业化”?
  2. 在调用int时,我是否会面临使用标记模板参数bool而不是flag.fetch_or()的任何棘手陷阱?
  3. 我正在使用gcc 5.1.0,并使用-std=c++14进行编译。

1 个答案:

答案 0 :(得分:3)

C++11 N3337 draft不需要bool的方法。

29.5&#34;原子类型&#34;

template <class T> struct atomic {
  [...]
}

template <> struct atomic<integral> {
  [...]
  integral fetch_or(integral , memory_order = memory_order_seq_cst) noexcept;
  [...]
}

29.5 / 1:

  

原子特化操作的语义在29.6中定义。

29.6.3 / 2&#34;原子类型的算术运算&#34;:

  

在这些函数和函数模板特化的声明中,名称integral指的是整数类型,而名称atomic-integral指的是原子或指定的基类,用于表145中的积分或从表146中推断出来。< / p>

和表145不包含bool

因此,只有bool的整数(没有struct)专精才能使用该方法。

这有点令人困惑,因为在标准的其余部分,&#34;整数类型&#34;包括bool,3.9.1 / 7&#34;基本类型&#34;:

  

类型bool,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型。