Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default move constructor with mutex member

Tags:

c++

move

I have a class with deleted copy constructors and I'm trying to put a mutex member in something like this:

struct A {
    A(const A &other) = delete;
    A& operator=(const A &other) = delete;
    A(A&& other) = default;
    A& operator=(A &&other) = default;

    std::mutex lock;
};

The compiler is complaining that I'm trying to call the deleted copy constructor, which I summarise to be due to the std::mutex type being non-movable. How can I make the mutex member play with the move constructors with minimal fuss? I don't actually want to move the mutex member itself into the newly constructed object, and would actually like each moved object to just construct it's own mutex

like image 654
Madden Avatar asked Sep 21 '26 21:09

Madden


1 Answers

I don't actually want to move the mutex member itself into the newly constructed object, and would actually like each moved object to just construct it's own mutex

Then simply define your move constructor to construct a new mutex:

struct A {
    A(const A &other) = delete;
    A& operator=(const A &other) = delete;
    A(A&& other)
        : lock()
    {
    }

    A& operator=(A &&other) = delete;

    std::mutex lock;
};

Move assignment will still be a problem and should probably just be deleted. Unless you can answer the question: what happens to the existing mutex member when you're being assigned a new value? Particularly: what if you are assigned a new value while the existing mutex is locked?

like image 171
Michael Kenzel Avatar answered Sep 24 '26 09:09

Michael Kenzel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!