Почему класс с конструктором копирования и удаленным конструктором перемещения не конвертируется в себя?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему класс с конструктором копирования и удаленным конструктором перемещения не конвертируется в себя?

Сообщение Anonymous »

Запросы «is_convertible_v конструктор перемещения удален» и «удаленный конструктор перемещения C++ делает класс неконвертируемым в себя», поэтому я надеюсь, что я не дублирую то, на что уже был дан ответ... начнем...
У меня есть следующий класс:

Код: Выделить всё

#include 

struct OnlyCopyable {
OnlyCopyable()  { }
~OnlyCopyable()  { }
OnlyCopyable(const OnlyCopyable &src) { }
OnlyCopyable& operator=(const OnlyCopyable &other) { return *this; }
OnlyCopyable(OnlyCopyable &&other) = delete;
OnlyCopyable& operator=(OnlyCopyable &&other) = delete;

};

static_assert(std::is_convertible_v);
Похоже, что его нельзя преобразовать в себя. Почему это?
Если я закомментирую строки, явно удаляющие операторы перемещения, они станут конвертируемыми. Почему?
CPPReference говорит следующее:

Если определение воображаемой функции To test() { return std::declval(); имеет правильный формат (то есть либо std::declval() можно преобразовать в To с помощью неявных преобразований, либо и From, и To , возможно, имеют сертификат cv void), предоставляет значение константы-члена, равное true

Что я прочитал это означает, что класс только с конструктором копирования должен быть конвертирован в сам... что я пропустил? Спасибо.
РЕДАКТИРОВАТЬ:
Я исследовал немного дальше и определил, согласно приведенной выше цитате, следующее:

Код: Выделить всё

OnlyCopyable test() { return std::declval(); }
И вот, это не работает с сообщением об ошибке: использование удаленной функции «OnlyCopyable::OnlyCopyable(OnlyCopyable&&)».
Я понимаю, почему описанное выше не удалось, потому что удаленный оператор по-прежнему принимает участие в разрешении перегрузки, и если он выбран, это приводит к сбою.
Однако это все еще меня озадачивает... почему конвертируемость определяется таким образом? Конечно, класс все еще можно конвертировать... просто копируя, а не перемещая?

Подробнее здесь: https://stackoverflow.com/questions/793 ... convertibl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»