Неявно сгенерированный конструктор копирования определен как удаленный , поскольку ваш класс содержит std::future
, который нельзя скопировать. Это означает, что ваш класс не может быть скопирован в любом случае.
Однако он может быть подвижный . Обычно показанный вами пример может также использовать конструктор перемещения , но неявный конструктор перемещения не объявляется, когда вы объявляете деструктор вручную, поэтому Foo
в первом примере также не может быть перемещен, в то время как он находится в второй.
Как упомянуто @Ayxan в комментарии к вопросу, поскольку C ++ 17 скомпилирует оба ваших примера, поскольку, хотя Foo
не может быть перемещен в первом примере, поскольку C ++ Применяются 17 обязательных правил исключения, и в вашем примере будет только один Foo
, встроенный непосредственно в Foo b
. Временных Foo
объектов не будет, и для этого не нужно будет копировать или перемещать класс.
В общем случае вы всегда должны реализовывать конструктор копирования / перемещения и операторы присваивания вручную, если у вас есть пользовательский деструктор. Это известно как правило 3/5 . Язык в настоящее время не применяет это правило для операций копирования, хотя неявное объявление операций копирования, если существует объявленный пользователем деструктор, устарело с C ++ 11. Тем не менее, язык обеспечивает соблюдение правила для операций перемещения, неявно объявляя операции перемещения, если присутствует объявленный пользователем деструктор.
Пользовательский деструктор не требуется часто, поэтому вам, вероятно, не следует объявлять его в первое место. Если вам нужно объявить это, потому что, например, вам нужно, чтобы оно было virtual
(в этом случае оно должно быть просто по умолчанию с virtual ~Foo() = default
), тогда вы можете по умолчанию операции перемещения:
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
Но если у вашего деструктора есть пользовательское определение, в котором есть операторы, которые фактически выполняют некоторую работу, вы, вероятно, должны реализовать эти методы самостоятельно с надлежащей семантикой, чтобы не возникало проблем при перемещении класса.