У меня есть следующий класс:
Код: Выделить всё
#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(); }
Я понимаю, почему описанное выше не удалось, потому что удаленный оператор по-прежнему принимает участие в разрешении перегрузки, и если он выбран, это приводит к сбою.
Однако это все еще меня озадачивает... почему конвертируемость определяется таким образом? Конечно, класс все еще можно конвертировать... просто копируя, а не перемещая?
Подробнее здесь: https://stackoverflow.com/questions/793 ... convertibl