Конструктор / назначение перемещения по умолчанию и конструктор / назначение удаленной копии

Согласно стандарту,

Если определение класса X явно не объявляет конструктор перемещения, он будет неявно объявлен как дефолтный, если и только если

- X не имеет объявленного пользователем конструктора копирования,

- X не имеет заявленного пользователем оператора копирования,

- X не имеет объявленного пользователем оператора назначения перемещения, и

- X не имеет объявленного пользователем деструктора.

Теперь следующее не компилируется

# include <utility>

class Foo
{
public:
  Foo() = default;
  Foo(Foo const &) = delete;
};

int main()
{
  Foo f;
  Foo g(std::move(f)); // compilation fails here
  return 0;
}

Таким образом, кажется, что удаленная функция считается пользовательской, что имеет смысл (это не реализация по умолчанию). Тем не менее, в этом конкретном случае, как бы конструктор / назначение перемещения по умолчанию удалял копию конструктор / назначение?

Я думаю, что этот вопрос имеет практическое значение, потому что ручная генерация и ESP. поддержание таких функций по умолчанию подвержено ошибкам, в то же время (праведное) увеличение использования таких классов, какstd::unique_ptr поскольку участники класса сделали не копируемые классы гораздо более обычными животными, чем раньше.

Ответы на вопрос(3)

Ваш ответ на вопрос