Дескриптор объявляет деструктор: это подавляет генерацию операций копирования и перемещения, кроме как - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь понять, что подразумевается под подавлением копирования / перемещения ctor / assignment. Например, в случаях, когда класс объявляет деструктор, но не объявляет операции перемещения / копирования ctor / assignment.

Изначально у меня сложилось впечатление, что они просто не будут созданы (удалены), и компиляция не удалась. Но после некоторых экспериментов, похоже, это не так. Однако если я явно отмечу конструктор копирования как удаленный, компиляция завершится неудачей.

Обратите внимание, что приведенный ниже фрагмент взят из раздела «Язык программирования C ++ (4-е издание)», раздел 17.6.3.3. В обсуждении, которое следует за замечаниями Страуструпа:

"Кроме того, Handle объявляет деструктор: это подавляет генерацию операций копирования и перемещения."

template< typename T >
class Handle {
    T *p;
  public:
    Handle( T *pp) : p{pp}{}

    T &operator*() {
      return *p;
    }

    // NOTE: I've added this method for testing.
    // this will cause compilation to fail, but commenting this
    // out does not fail compilation and g++ with -Wall emits no
    // warning
    Handle( const Handle &other ) = delete;

    ~Handle() {
      delete p;
    }
};

int
main( void ) {
  int x = 3;
  Handle< int >a( &x );
  Handle< int >b( a );
  return 0;
}

Скомпилировано с g ++ 6.3.0 с -std = c ++ 11

Итак, что именно означает «подавление», это означает, что мы не генерируем соответствующие методы, если только некоторая часть кода не использует его? Другими словами, имеет ли Handle b (a); переопределить «подавление»?

...