[英]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>
”被視為“非專業化”,我認為是問題的根源。 所以我懷疑:
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.