VS2017: конструктор копирования не работает при удалении конструктора перемещения
Рассмотрим следующий фрагмент кода:
#include <iostream>
using namespace std;
struct Snitch {
Snitch() { cout << "c'tor" << endl; }
~Snitch() { cout << "d'tor" << endl; }
Snitch(const Snitch&) { cout << "copy c'tor" << endl; }
Snitch& operator=(const Snitch&) {
cout << "copy assignment" << endl;
return *this;
}
Snitch(Snitch&&) = delete;
Snitch& operator=(Snitch&&) = delete;
};
Snitch CreateSnitch(bool v) {
Snitch a, b;
if (v) {
return a;
}
return b;
}
int main(int argc, char** argv)
{
Snitch s = CreateSnitch(true);
}
Это тот случай, когда RVO не работает, поэтому при возврате объекта из функции должна вызываться конструкция move. Но так как конструкция перемещения удалена, я предположил, что должен быть вызван конструктор копирования. Вместо этого я получаю следующую ошибку компиляции в вышеупомянутой среде:
Ошибка C2280 "Snitch::Snitch(Snitch &&)": попытка сослаться на удаленную функцию
Кроме того, когда я добавляю const
Ключевое слово, чтобы вернуть тип значения и локальные переменные a
а также b
оно работает. Я предполагаю, что последняя часть компилируется, потому что компилятор "понимает", что нет способа вызвать конструктор перемещения и вызывает конструктор копирования. Итак, я не понимаю, почему исходный код не компилируется.