Для краткого ответа: нет.
Если мы посмотрим на текущую спецификацию (начиная с c ++ 17) std :: vector, у нас будет следующая подпись и описание:
vector(const vector& other);
Копировать конструктор. Создает контейнер с копией содержимого другого. Если alloc не предоставлен, allocator получается как будто путем вызова std :: allocator_traits :: select_on_container_copy_construction (other.get_allocator ()).
Конструктор копирования имеет обычную каноническую подпись, и в описании не указано никаких условий SFINAE, поэтому соответствующая реализация не должна налагать более строгие требования, такие как условное удаление. Тем не менее, ошибка экземпляра произойдет, если будет предпринят явный или неявный вызов ctor-копии vector<unique_ptr<T>>
, поскольку описание подразумевает поэлементное копирование. Таким образом, vector<unique_ptr<T>>
не удовлетворяет требованию CopyConstructible
, что очень похоже на наличие конструктора удаленной копии.
Насколько я знаю, нет синтаксической поддержки условного удаления, но условия SFINAE и скоро появившиеся ограничения могут обеспечить выборочное разрешение перегрузки. Я все еще настоятельно рекомендую не использовать их в специальных операциях. Специальные операции должны быть определены с использованием их обычной канонической подписи.