ошибка: использование удаленной функции 'std :: atomic <_Tp> :: atomic () [with _Tp = node]' - PullRequest
2 голосов
/ 30 июня 2019

Проблема компиляции при использовании atomic с классами.

ошибка: использование удаленной функции 'std :: atomic <_Tp> :: atomic () [with _Tp = node]' stack () {^

/ usr / include / c ++ / 5 / atomic: 185: 7: note: 'std :: atomic <_Tp> :: atomic () noexcept [with _Tp = node]' неявно удаляется, поскольку его исключение-спецификация не соответствует неявной спецификации исключений '' atomic () noexcept = default;^

#include <atomic>
#include <cstdlib>
#include <memory>

class node
{
private:
    int data;
    bool hasTransaction;
public:    
    node(int& data) : data(data), hasTransaction(true) {}
    node() : data(10), hasTransaction(true) {}
};

class stack {
    std::atomic<node> head;
public:
    void push(int data) {
        node new_node(data);

        node current = head.load(std::memory_order_relaxed);

        while (!head.compare_exchange_strong(
                    current,
                    new_node,
                    std::memory_order_release,
                    std::memory_order_relaxed))
            ;
    }

    stack() {
        node a;
        std::atomic_init(&head, a);
        head.store(a);
    };
};

int main()
{
    stack s;
    s.push(1);
    s.push(2);
    s.push(3);
}

1 Ответ

2 голосов
/ 30 июня 2019

Это потому, что конструктор вашего типа node по умолчанию не помечен noexcept. Конструктор std::atomic<T> по умолчанию помечен как noexcept, поэтому конструктор T по умолчанию также должен быть.

Следует читать:

node() noexcept : data(10), hasTransaction(true) {}

Однако вы, вероятно, должны знать, что если ваш тип не является тривиальным, этот «атомарный» тип, вероятно, станет поточно-ориентированным через мьютекс. Таким образом, использование атомной техники в этом случае только усложняет вашу жизнь без выгоды.

Как правило, вы не захотите использовать атомики, если это не для некоторого примитивного типа (обычно необработанный указатель или целочисленный тип).

...