使用以下代码摘录:
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引用说“完全专业化atomic<bool>
”被视为“非专业化”,我认为是问题的根源。所以我怀疑:
int
时,我是否会面临使用标记模板参数bool
而不是flag.fetch_or()
的任何棘手陷阱?我正在使用gcc 5.1.0,并使用-std=c++14
进行编译。
答案 0 :(得分:3)
C++11 N3337 draft不需要bool
的方法。
29.5&#34;原子类型&#34;
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&#34;原子类型的算术运算&#34;:
在这些函数和函数模板特化的声明中,名称integral指的是整数类型,而名称atomic-integral指的是原子或指定的基类,用于表145中的积分或从表146中推断出来。< / p>
和表145不包含bool
。
因此,只有bool
的整数(没有struct
)专精才能使用该方法。
这有点令人困惑,因为在标准的其余部分,&#34;整数类型&#34;包括bool,3.9.1 / 7&#34;基本类型&#34;:
类型bool,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型。