C++ std::atomic:<bool>:fetch_or 未实现?

c++ std::atomic<bool>::fetch_or not implemented?

本文关键字:or fetch 实现 bool std atomic lt C++ gt      更新时间:2023-10-16

加上这段代码:

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<bool>"被视为"非专门化",我认为这是问题的根源。所以我的疑问:

  1. "完全专门化"如何被"视为非专业化"?
  2. 在调用flag.fetch_or()时,我可能会面临任何棘手的陷阱,使用作为标志模板参数int而不是bool ?

我正在使用gcc 5.1.0,并与-std=c++14编译。

c++ 11 N3337草案不要求bool使用该方法。

29.5 "Atomic types"

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 "原子类型上的算术运算":

在这些函数和函数模板特化的声明中,名称integral指的是一个整型,名称atomic-integral指的是表145中或从表146中推断出来的atomic或命名的integral基类。

和表145不包含bool

所以只有struct的整型专门化(不包括bool)才有这个方法。

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

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