Условия для объявления функции, удаленной c

#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 более подходит в вашем случае?