2015-05-15 10 views
3

С помощью этого отрывка кода: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>» рассматривается как «неспециализированная », что я считаю источником проблем. Так что мои сомнения:

  1. Как можно «квалифицировать полную специализацию» как неспециализированную?
  2. Может ли я столкнуться с какими-либо хитрыми ловушками, используя в качестве параметра шаблона флага int вместо bool при звонке flag.fetch_or()?

Я использую gcc 5.1.0 и компилирую с помощью -std=c++14.

+1

Вы смотрели в [ 'fetch_or'] (http://en.cppreference.com/w/cpp/atomic/atomic/fetch_or)? Он определен только для типа данных * Integral *. – m0nhawk

+2

Используйте 'compare_exchange_strong'. –

+0

Я не понимаю: 'atomic :: fetch_or()' не может принимать 'bool' как второй аргумент, а только необязательный' memory_order'. –

ответ

2

C++11 N3337 draft не требует этого метода для 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:

The semantics of the operations on specializations of atomic are defined in 29.6.

29.6.3/2 "Арифметические операции на атомных типов":

In the declarations of these functions and function template specializations, the name integral refers to an integral type and the name atomic-integral refers to either atomic or to a named base class for integral from Table 145 or inferred from Table 146.

и таблице 145 не содержит bool.

Таким образом, только интеграл (без bool) специализации struct будет иметь этот метод.

Это немного сбивает с толку, потому что в остальной части стандарта, «Целочисленные типы» включает в себя BOOL, 3.9.1/7 «Основные типы»:

Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.