#c 11 #deleted-functions
#c 11 #удаленные функции
Вопрос:
ВСЕ,
При каких условиях компилятор сам объявляет функцию удаленной?
Рассмотрим следующее:
class Foo
{
public:
Foo();
virtual void func1() = 0;
virtual void func2() = 0;
virtual bool func3();
}
class Bar : public Foo
{
public:
Bar(int param1);
virtual void func1() override;
virtual void func2() override;
virtual bool func3() override;
}
class Baz
{
public:
Baz(std::unique_ptr<Foo> amp;foo)
{
m_foo = foo;
}
private:
std::unique_ptr<Foo> m_foo;
}
Я получаю ошибку компилятора при назначении (MSVC 2019):
attempting to reference a deleted function
Это скомпилировано с C 11.
ТИА!
Ответ №1:
Ошибка, похоже, исходит из строки m_foo = foo
unique_ptr не может быть скопирован таким образом unique_ptramp; operator=(const unique_ptramp;) is deleted
.
Уникальные указатели относятся к исключительному владению. Таким образом, если вы хотите передать право собственности baz, вам нужно будет переместить unique_ptr.
Например:
Baz(std::unique_ptr<Foo> foo) : m_foo{std::move(foo)}
{
}
Для выполнения условий компилятор объявляет специальный элемент удаленным (под объявленным мы подразумеваем обычное объявление или =default или =deleted):
- если объявлен деструктор, или операция копирования, или операция присваивания, то операторы перемещения помечаются как удаленные,
- если объявлен только один из операторов перемещения, другой помечается как удаленный,
- если объявлена операция копирования перемещения или операция назначения перемещения, обычные операции копирования / назначения помечаются как удаленные.
Комментарии:
1.
std::move()
является C 14. Я работаю с C 11. Кроме того, я думаю, что нашел причину —operator=(const std::unique_ptr amp;)
в документации помечено как удаленное, я не знаю, как это исправить. (ссылка. cplusplus.com/reference/memory/unique_ptr/operator = )2.
std::move
поставляется с c 11 и его семантикой перемещения. Для оператора, как я сказал в ответе, это предназначено. Может быть, совместное владение с использованиемshared_ptr
более подходит в вашем случае?