Значение = 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 };
-
= 0
означает, что функция является чисто виртуальной, и вы не можете создать экземпляр объекта этого класса. Вам нужно вывести из него и реализовать этот метод -
= 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
.
= 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;