[英]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.