Что случилось с std :: atomic <X>:: value_type? - PullRequest
0 голосов
/ 06 декабря 2018

Согласно этому справочному руководству

Для каждого std :: atomic (независимо от того, специализирован ли он) std :: atomic :: value_type равно X.

Но если я пытаюсь использовать такой тип, я получаю ошибку компиляции.

Я пробовал это с g++ 8.2.1:

$ g++ -std=c++11 test.cc 
test.cc: In function ‘int main()’:
test.cc:6:23: error: ‘value_type’ is not a member of ‘std::atomic<int>’
     std::atomic<int>::value_type x = 0;

И с Clang 6.0.1

$ clang -std=c++11 test.cc 
test.cc:6:23: error: no type named 'value_type' in 'std::atomic<int>'
    std::atomic<int>::value_type x = 0;
~~~~~~~~~~~~~~~~~~^

В вышеупомянутом справочном руководстве также указано, что ...

спецификация была существенно переписана для решения многочисленных проблем, в частности, добавлены члены typedefs value_type и diff_type_type

Спецификация P0558R1 , тем не менее, не запрещает существование value_type.

Есть идеи, что происходит?

Редактировать

Мой коллега заставил меня понять, что P0558R1 - это просто предложение .

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Учитывая природу P0558R1, я ожидал, что он в конечном итоге будет реализован задним числом в предыдущих стандартных режимах как отчет о дефектах де-факто, и задокументировал его как таковой.В статье выполняются основные операции с шаблонами функций, не являющихся членами, которые зависят от наличия этих typedef.Подобные операции обычно применялись разработчиками задним числом.В качестве точки данных, единственная известная реализация, которая полностью реализовала P0558R1 (MSVC), делает это независимо от языковой версии.

Цель cppreference - гипотетическая полная и правильная реализация каждого стандарта C ++, а также всех отчетов о дефектах и ​​пояснений.применимо к этому стандарту.

0 голосов
/ 06 декабря 2018

Вы явно используете C ++ 11.Если мы посмотрим на страницу 1119 последнего варианта стандарта C ++ 11, то здесь нет упоминания value_type для std::atomic:

template <class T> struct atomic {
    bool is_lock_free() const volatile;
    bool is_lock_free() const;
    void store(T, memory_order = memory_order_seq_cst) volatile;
    void store(T, memory_order = memory_order_seq_cst);
    T load(memory_order = memory_order_seq_cst) const volatile;
    T load(memory_order = memory_order_seq_cst) const;
    operator T() const volatile;
    operator T() const;
    T exchange(T, memory_order = memory_order_seq_cst) volatile;
    T exchange(T, memory_order = memory_order_seq_cst);
    bool compare_exchange_weak(T&, T, memory_order, memory_order) volatile;
    bool compare_exchange_weak(T&, T, memory_order, memory_order);
    bool compare_exchange_strong(T&, T, memory_order, memory_order) volatile;
    bool compare_exchange_strong(T&, T, memory_order, memory_order);
    bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst) volatile;
    bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst);
    bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst) volatile;
    bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst);

    atomic() = default;
    constexpr atomic(T);
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    T operator=(T) volatile;
    T operator=(T);
};

Он также отсутствуетв проекте C ++ 14.

cppreference просто не упоминает "начиная с C ++ 17" для value_type.

Редактировать: было отмечено, что добавление value_type был в форме отчета о дефектах и ​​ должен применяться ретроактивно к реализациям C ++ 11.Таким образом, cppreference не является на самом деле неправильным, DR просто не был реализован в данных версиях компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...