首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ std::atomic<bool>::fetch_or没有实现吗?

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

Stack Overflow用户
提问于 2015-05-15 08:08:35
回答 1查看 1.1K关注 0票数 3

下面是代码的摘录:

代码语言:javascript
复制
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;
    }
};

我有以下编译错误:

代码语言:javascript
复制
error: ‘volatile struct std::atomic<bool>’ has no member named ‘fetch_or’   
   return !flag.fetch_or(flag, true);

但是,如果我将模板参数更改为int,则会进行编译。

代码语言:javascript
复制
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. 请允许我在调用int时使用标志模板参数bool而不是bool来面对任何棘手的问题吗?

我使用gcc 5.1.0,用-std=c++14编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 13:42:23

C++11 N3337草案不需要用于bool的方法。

29.5“原子类型”

代码语言:javascript
复制
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“原子类型的算术运算”:

在这些函数和函数模板专门化的声明中,名称整指整型,而名称原子整指的是原子类或命名基类,用于表145中的整数或从表146推断。

表145不包含bool

因此,只有积分(不含bool)的struct专门化才会有该方法。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30254582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档