下面是代码的摘录:
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>”被视为“非专门化”,我认为这是问题的根源。所以我怀疑:
int时使用标志模板参数bool而不是bool来面对任何棘手的问题吗?我使用gcc 5.1.0,用-std=c++14编译。
发布于 2015-06-16 13:42:23
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“原子类型的算术运算”:
在这些函数和函数模板专门化的声明中,名称整指整型,而名称原子整指的是原子类或命名基类,用于表145中的整数或从表146推断。
表145不包含bool。
因此,只有积分(不含bool)的struct专门化才会有该方法。
这有点令人困惑,因为在标准的其余部分,“整型”包括bool,3.9.1/7“基本类型”:
bool、char、char16_t、char32_t、wchar_t以及有符号和无符号的整数类型统称为整型。整数类型的同义词是整数类型。
https://stackoverflow.com/questions/30254582
复制相似问题