Я пытаюсь понять, что подразумевается под подавлением копирования / перемещения 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); переопределить «подавление»?