Полагаю, я не понимаю разницу между удалением конструктора перемещения и его отсутствием.
Когда вы делаете
struct S
{
S() = default;
S(const S&) {
std::cout << "Copying" << std::endl;
}
};
Компилятор не будетсоздать конструктор перемещения.Если вы попытаетесь переместить его, разрешение перегрузки будет найдено только S(const S&)
, и вы получите копию.С
struct S
{
S() = default;
S(const S&) {
std::cout << "Copying" << std::endl;
}
S(S&&) = delete;
};
Когда вы перемещаете объект типа S
, разрешение перегрузки находит S(const S&)
и S(S&&)
, но оно выбирает S(S&&)
, так как это лучшее совпадение.Затем он видит, что он удален, и вы получаете ошибку.
Необходимо помнить, что удаленные конструкторы не удаляют их из класса.Он объявляет их и делает их доступными для разрешения перегрузки, и только после разрешения перегрузки он проверяет, удален ли он.