C++ c++;标准::原子<;bool>;::fetch\u是否已实现?

C++ c++;标准::原子<;bool>;::fetch\u是否已实现?,c++,embedded,atomicity,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

以下代码摘录如下:

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;
    }
};
参考文献说,“完全专业化
原子化
”被视为“非专业化”,我认为这是问题的根源。所以我怀疑:

  • “完全专业化”如何“被视为非专业化”
  • 在调用
    flag.fetch_或()
    时,使用作为标志模板参数
    int
    而不是
    bool
    是否会遇到任何棘手的陷阱
  • 我正在使用gcc 5.1.0,并使用
    -std=c++14
    进行编译

    对于
    bool
    ,不需要该方法

    29.5“原子类型”

    模板结构原子{
    [...]
    }
    模板结构原子{
    [...]
    整数取数或(整数,内存顺序=内存顺序)无例外;
    [...]
    }
    
    29.5/1:

    原子的专门化操作的语义在29.6中定义

    29.6.3/2“原子类型的算术运算”:

    在这些函数和函数模板专门化的声明中,名称integral指的是一种整数类型,而名称atomic integral指的是表145或表146中的integral的原子类或命名基类

    表145不包含
    bool

    因此,只有
    struct
    的integral(不带
    bool
    )专门化将具有该方法

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

    类型bool、char、char16\u t、char32\u t、wchar\u t以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型


    你调查过这件事了吗?它仅为整型数据类型定义。请使用
    比较交换\u strong
    。我不明白:
    原子::fetch\u或()
    不能将
    bool
    作为第二个参数,只能使用可选的
    内存顺序
    try\u set
    应该做什么?难道不应该用一个论点来比较,而不是和它自己比较吗?
    error: ‘volatile struct std::atomic<bool>’ has no member named ‘fetch_or’   
       return !flag.fetch_or(flag, true);
    
    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;
        }
    };
    
    template <class T> struct atomic {
      [...]
    }
    
    template <> struct atomic<integral> {
      [...]
      integral fetch_or(integral , memory_order = memory_order_seq_cst) noexcept;
      [...]
    }