Означает ли это, что наличие класса, удовлетворяющего этим трем условиям, устарело?
Да; если у вас есть оператор или деструктор, назначенный для копирования, вы должны также объявить конструктор копирования. По сути, это просто говорит о том, что ваш класс должен следовать правилу Три (или Пять, или как он называется в C ++ 11).
Это кажется странным само по себе, что стандартное поведение - на одном дыхании - не рекомендуется.
Поведение предписано стандартом, потому что это было поведение в C ++ 03 - изменение его нарушило бы унаследованный код. Так же, как стандарт определяет поведение (например) спецификаций динамических исключений, а также осуждает их.
Как пример кода, введенный словом «Таким образом», имеет какое-либо отношение к «последнему» случаю, который я выделил курсивом?
Это не имеет ничего общего с "последним" делом.
Это иллюстрация потенциальной проблемы, вызванной нормальным поведением, определенным в предложении: будет конфликт между неявно объявленным конструктором копирования и объявленным пользователем конструктором с аргументами по умолчанию, так что его можно вызывать как конструктор копирования.
Где эта "двусмысленность"?
Рассмотрим код:
X x1; // assume there's also a default constructor
X x2(x);
Должен ли x2
быть инициализирован с помощью объявленного пользователем конструктора (со вторым аргументом, принимающим значение по умолчанию) или неявно объявленным конструктором копирования? Оба одинаково хорошо подходят для использования. Это двусмысленность.