С помощью этого отрывка кода:C++ std :: atomic <bool> :: fetch_or не реализован?
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
.
Вы смотрели в [ 'fetch_or'] (http://en.cppreference.com/w/cpp/atomic/atomic/fetch_or)? Он определен только для типа данных * Integral *. – m0nhawk
Используйте 'compare_exchange_strong'. –
Я не понимаю: 'atomic :: fetch_or()' не может принимать 'bool' как второй аргумент, а только необязательный' memory_order'. –