Могу ли я использовать интеллектуальный указатель с членом мьютекса?

#c #c 11 #unique-ptr

#c #c 11 #уникальный-ptr

Вопрос:

Допустим, у меня есть динамический выделенный объект foo , у которого есть std::mutex член:

 #include <mutex>
#include <memory>

class foo {
    public:
        foo()=default;
        ~foo();
    private:
        std::mutex lock;
};

int main(){
    std::unique_ptr<foo> a = std::make_unique<foo>(foo());
    return 0;
}
 

Я пытался использовать интеллектуальный указатель, но это не имеет смысла:

 rog.cc:4:7: error: use of deleted function 'std::mutex::mutex(const std::mutexamp;)'
In file included from /opt/wandbox/gcc-head/include/c  /11.0.0/mutex:43,
                 from prog.cc:1:
/opt/wandbox/gcc-head/include/c  /11.0.0/bits/std_mutex.h:94:5: note: declared here
   94 |     mutex(const mutexamp;) = delete;
      |     ^~~~~
 

должен ли я использовать необработанный указатель для управления этим объектом?

Ответ №1:

Вы создаете временный объект foo() и передаете его std::make_unique() . std::make_unique() создаст управляемый объект из временного foo , но foo не может быть скопирован или перемещен.

Чтобы получить std::unique_ptr управление, созданное по умолчанию foo , вы можете просто опустить временный объект:

 std::unique_ptr<foo> a = std::make_unique<foo>();