簡體   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