Значение = delete после объявления функции

class my_class
{
    ...
    my_class(my_class const &) = delete;
    ...
};

что значит = delete значит в этом контексте?

существуют ли другие " модификаторы "(кроме = 0 и = delete)?

8 ответов


удаления функции функция C++11:

общий язык "запрет копирования" теперь может быть выражена напрямую:

class X {
    // ...
    X& operator=(const X&) = delete;  // Disallow copying
    X(const X&) = delete;
};

[...]

механизм "delete" можно использовать для любой функции. Например, мы может устранить нежелательное преобразование, как это:

struct Z {
    // ...

    Z(long long);     // can initialize with an long long         
    Z(long) = delete; // but not anything less
};

  1. = 0 означает, что функция является чисто виртуальной, и вы не можете создать экземпляр объекта этого класса. Вам нужно вывести из него и реализовать этот метод
  2. = delete означает, что компилятор не будет генерировать эти конструкторы. AFAIK это разрешено только для конструктора копирования и оператора присваивания. Но я не слишком хорош в предстоящем стандарте.

этот отрывок из язык программирования C++ [4-е издание] - Bjarne Stroustrup книга рассказывает о реальная цель за помощью =delete:

использование копии или перемещения по умолчанию для класса в иерархии обычно а катастрофа: учитывая только указатель на базу, мы просто не знаем, что члены производного класса (§3.2.2), так что не знаю как скопировать их!--5-->. Итак, лучшее, что можно сделать, это обычно удаление копии по умолчанию и переместить операции, то есть устранить определения по умолчанию эти две операции:

class Shape {
public:
  Shape(const Shape&) =delete; // no copy operations
  Shape& operator=(const Shape&) =delete;

  Shape(Shape&&) =delete; // no move operations
  Shape& operator=(Shape&&) =delete;
  ˜Shape();
    // ...
};

Теперь попытка скопировать фигуру будет поймана компилятором.

на =delete механизм общий, то есть его можно использовать для подавления любой операции


существуют ли другие " модификаторы "(кроме = 0 и = delete)?

поскольку, похоже, никто больше не ответил на этот вопрос, я должен упомянуть, что есть также =default.

https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions


= delete - это функция, введенная в C++11. Согласно =delete не будет разрешено вызывать эту функцию.

подробнее.

предположим, в классе.

Class ABC{
 Int d;
 Public:
  ABC& operator= (const ABC& obj) =delete
  {

  }
};

при вызове этой функции для назначения obj она не будет разрешена. Оператор присваивания средств будет ограничивать копирование с одного объекта на другой.


новый стандарт C++0x. Пожалуйста, см. раздел 8.4.3 в N3242 рабочий проект


стандарты кодирования, с которыми я работал, имели следующее Для большинства объявлений классов.

  //  coding standard: disallow when not used
  T(void)                  = delete; // default ctor    (1)
  ~T(void)                 = delete; // default dtor    (2)
  T(const T&)              = delete; // copy ctor       (3)
  T(const T&&)             = delete; // move ctor       (4)
  T& operator= (const T&)  = delete; // copy assignment (5)
  T& operator= (const T&&) = delete; // move assignment (6)

Если вы используете любой из этих 6, то просто закомментируйте соответствующую строку.

пример: класс FizzBus требует только dtor, и поэтому не используйте другие 5.

//  coding standard: disallow when not used
FizzBuzz(void)                         = delete; // default ctor (1)
// ~FizzBuzz(void);                              // dtor         (2)
FizzBuzz(const FizzBuzz&)              = delete; // copy ctor    (3)
FizzBuzz& operator= (const FizzBuzz&)  = delete; // copy assig   (4)
FizzBuzz(const FizzBuzz&&)             = delete; // move ctor    (5)
FizzBuzz& operator= (const FizzBuzz&&) = delete; // move assign  (6)

мы комментируем только 1 здесь и устанавливаем его реализацию еще где (возможно, где предлагает стандарт кодирования). Остальные 5 (из 6) запрещено удаление.

вы также можете использовать '= delete', чтобы запретить неявные рекламные акции различного размера... пример

 // disallow implicit promotion's 
  template <class T> operator T(void)              = delete;
  template <class T> Vuint64& operator=  (const T) = delete;
  template <class T> Vuint64& operator|= (const T) = delete;
  template <class T> Vuint64& operator&= (const T) = delete;

Это новая вещь в стандартах C++ 0x, где вы можете удалить унаследованную функцию.