繁体   English   中英

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

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

有了这段代码:

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“原子类型”

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中推断出来。

和表145不含有bool

因此,只有struct的整数(没有bool )特化才会有该方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM