#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>();